Was ist die richtige Art und Weise der Erstellung und Ausführung von e2e Integrationstests für Jersey REST API, die jersey-test-framework-provider-inmemory
, h2-Datenbank und org.springframework.jdbc.core.JdbcTemplate
verwendet?Jersey e2e Integrationstests für In-Memory-Datenbank mit Spring JDBCTemplate
Anforderungen:
Der Prüfumfang sollte End-to-End sein: von Ressource beginnen und zur h2-Datenbank über alle Anwendungen geht.
Writing Tests:
Derzeit meine JUnit Integrationstests schlagen fehl, wenn alle zusammen von IDE JUnit ausführen, vor allem, weil sie sich gegenseitig stören (gleichzeitig mit JUnit ausgeführt wird). Ein weiteres Problem ist, dass nach jedem Test ein Rollback durchgeführt werden sollte, verwenden Sie die Transaktionsunterstützung (derzeit hilft @Transactional
Annotation nichts zu helfen). Was ist der minimale Satz an Spring-Tools, die für diese Art von Tests benötigt werden? Wie funktioniert es? Sollte @Transactional
irgendwo anders platziert werden?
Beispiel:
@Transactional
public class OrderResourceIT extends JerseyTest {
@Override
protected Application configure() {
// config
}
@Override
protected void configureClient(final ClientConfig config) {
// config
}
@Before
public void startUp(){
// database bootstrap programmatically before each test
}
@Test
@Transactional
public void testGetOrders(){
Response response = target("/orders")
.request()
.get();
List<Order> orders = response.readEntity(new GenericType<List<Order>>(){});
// asserts
}
}
Ausführung:
Vorgesehen ist mit maven-failsafe-plugin
auszuführen:
Failsafe Plugin documentation schlägt Bindung Ausgang des Behälters zu pre-integration-test phase
und post-integration-test
am Behälter Termination. Wie kann es konfiguriert werden, wenn mein jersey-container-grizzly2-http
Container programmgesteuert konfiguriert ist? Example:
public class Main {
// Base URI the Grizzly HTTP server will listen on
public static final String BASE_URI = "http://localhost:8080/myapp/";
public static HttpServer startServer() {
// create a resource config that scans for JAX-RS resources and providers
// in com.example.rest package
final ResourceConfig rc = new ResourceConfig().packages("com.example.rest");
// create and start a new instance of grizzly http server
// exposing the Jersey application at BASE_URI
return GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
}
public static void main(String[] args) throws IOException {
final HttpServer server = startServer();
System.out.println(String.format("Jersey app started with WADL available at "
+ "%sapplication.wadl\nHit enter to stop it...", BASE_URI));
System.in.read();
server.stop();
}
}
wäre perfekt Beispielcode zu sehen arbeiten.
Sie kann nicht über eine HTTP-Anforderung die Transaktionsgrenze überspannen, so dass, wenn Sie die Tests isolieren müssen Während sie gleichzeitig laufen, würde ich einen anderen Datenbank-/Web-Container pro Test starten, ähnlich wie die DropwizardAppRule-Klasse funktioniert, etwa so: https://gist.github.com/stringy05/76a0 1aa4d611829ab1b59dd938b9db6d, müssen nur Ihre Feder-Umgebung und db-Layer ersetzen, sollte dies mit SpringClassRule tun können – stringy05