Каков надлежащий способ разработки и запуска тестов интеграции e2e для API Джерси REST, который использует jersey-test-framework-provider-inmemory
, h2 базу данных и org.springframework.jdbc.core.JdbcTemplate
?
Требования:
Область тестирования должна быть сквозной: начиная с ресурса и проходя через все приложения в базе данных h2.
Дать тесты:
В настоящее время мои интеграционные тесты JUnit терпят неудачу, если они выполняются вместе с IDE JUnit, главным образом потому, что они мешают друг другу (выполняется одновременно с JUnit). Другая проблема заключается в том, что после каждого теста нужно откатывать, использовать поддержку транзакций (в настоящее время аннотация @Transactional
ничего не помогает). Какой минимальный набор инструментов Spring необходим для поддержки такого рода тестов?
Как заставить его работать? Должен ли @Transactional
размещаться где-нибудь еще?
Пример:
@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
}
}
Исполнение:
Планируется выполнить с помощью maven-failsafe-plugin
:
Документация Failsafe Plugin предлагает связать запуск контейнера с pre-integration-test phase
и post-integration-test
при завершении контейнера.
Как его настроить, если мой контейнер jersey-container-grizzly2-http
настроен программно? Пример:
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();
}
}
Было бы замечательно видеть рабочий пример кода.