Qual è il modo corretto di progettare ed eseguire test di integrazione di e2e per l'API REST di Jersey che utilizza jersey-test-framework-provider-inmemory
, database h2 e org.springframework.jdbc.core.JdbcTemplate
?Test di integrazione e2e Jersey per database in memoria utilizzando Spring's JDBCTemplate
Requisiti:
L'ambito test deve essere end-to-end: a partire da risorse e passando attraverso tutte le applicazioni al database h2.
test di scrittura:
Attualmente il mio test di integrazione JUnit fallire se corrono tutti insieme da JUnit di IDE, soprattutto perché interferiscono con l'altro (in esecuzione in concomitanza con JUnit). Un altro problema è che dovrebbero essere ripristinati dopo ogni test, utilizzare il supporto per le transazioni (attualmente l'annotazione @Transactional
non aiuta). Qual è il set minimo di strumenti di Spring necessari per supportare questo tipo di test? Come farlo funzionare? Dovrebbe essere posizionato @Transactional
altrove?
Esempio:
@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
}
}
Esecuzione:
Si prevede di eseguire con maven-failsafe-plugin
:
Failsafe Plugin documentation suggerisce legame iniziale del contenitore pre-integration-test phase
e post-integration-test
al termine contenitore. Come può essere configurato se il mio contenitore jersey-container-grizzly2-http
è configurato a livello di programmazione? 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();
}
}
sarebbe perfetto per vedere lavorare codice di esempio.
non puoi attraversano il limite di transazione attraverso una richiesta HTTP, quindi se avete bisogno di isolare i test mentre corrono simultaneamente, ruoterò su un database/contenitore web diverso per test, simile a come funziona la classe DropwizardAppRule, simile a questo: https://gist.github.com/stringy05/76a0 1aa4d611829ab1b59dd938b9db6d, devi solo sostituire il tuo ambiente spring e db layer, dovrebbe essere in grado di farlo con SpringClassRule – stringy05