2011-12-14 9 views
54

Abbiamo un sacco di casi di test JUnit (test di integrazione) e sono raggruppati logicamente in diverse classi di test.Riutilizzare il contesto dell'applicazione molla attraverso le classi di test junit

Siamo in grado di caricare contesto di applicazione della molla una volta per classe di prova e ri-utilizzarlo per tutti i casi di test in una classe di test JUnit come indicato nel http://static.springsource.org/spring/docs/current/spring-framework-reference/html/testing.html

Tuttavia, abbiamo stavamo solo chiedendo se c'è un modo per carica il contesto dell'applicazione Spring una sola volta per un gruppo di classi di test JUnit.

FWIW, usiamo Spring 3.0.5, JUnit 4.5 e usiamo Maven per costruire il progetto.

+0

Tutte le risposte qui sotto sono grandi, ma non hanno un context.xml. Ho annotato la mia strada nel dimenticatoio? Un modo per farlo senza un context.xml? – markthegrea

risposta

67

Sì, questo è perfettamente possibile. Tutto quello che dovete fare è usare lo stesso attributo locations nelle vostre classi di test: contesti applicativi cache

@ContextConfiguration(locations = "classpath:test-context.xml") 

primavera per attributo locations quindi se la stessa locations appare per la seconda volta, Primavera utilizza lo stesso contesto piuttosto che la creazione di uno nuovo.

Ho scritto un articolo su questa funzione: Speeding up Spring integration tests. Inoltre è descritto in dettaglio nella documentazione di Spring: 9.3.2.1 Context management and caching.

Ciò ha implicazioni interessanti. Poiché Spring non sa quando JUnit è pronto, memorizza nella cache tutto il per sempre e li chiude usando il gancio di arresto JVM. Questo comportamento (soprattutto quando si hanno molte classi di test con diverso locations) può comportare un utilizzo eccessivo della memoria, perdite di memoria, ecc. Un altro vantaggio del contesto di memorizzazione nella cache.

+0

Ah! Non lo sapevo. Abbiamo seguito questo approccio per molto tempo e ho attribuito (erroneamente) la lunga durata dell'esecuzione del test al caricamento del contesto di primavera con ogni classe di test. Controllerà attentamente ora. Grazie. – Ramesh

+0

Direi piuttosto che la primavera non ha alcuna conoscenza circa l'ordine di esecuzione dei tuoi test. Di conseguenza, non può sapere se il contesto è richiesto in seguito o può essere eliminato. – philnate

+1

Non vedo come questo possa effettivamente essere vero. Eclipse/JUnit dedica 2 minuti all'avviamento dell'ambiente ogni volta che eseguo un test Run As/JUnit. Questo non accadrebbe se qualcosa fosse stato memorizzato nella cache. – user1944491

22

Per aggiungere a Tomasz Nurkiewicz's answer, è possibile utilizzare l'annotazione Spring 3.2.2 @ContextHierarchy per avere una struttura di contesto separata e associata. Ciò è utile quando più classi di test vogliono condividere (ad esempio) configurazioni di database in memoria (origine dati, EntityManagerFactory, tx manager ecc.).

Ad esempio:

@ContextHierarchy({ 
    @ContextConfiguration("/test-db-setup-context.xml"), 
    @ContextConfiguration("FirstTest-context.xml") 
}) 
@RunWith(SpringJUnit4ClassRunner.class) 
public class FirstTest { 
... 
} 

@ContextHierarchy({ 
    @ContextConfiguration("/test-db-setup-context.xml"), 
    @ContextConfiguration("SecondTest-context.xml") 
}) 
@RunWith(SpringJUnit4ClassRunner.class) 
public class SecondTest { 
... 
} 

Avendo questa configurazione contesto che utilizza "test-db-setup-context.xml" verrà creato solo una volta, ma fagioli interno può essere inserito in singola unità di prova contesto

Altro sul manuale: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html#testcontext-ctx-management (ricerca per "context hierarchy")

+0

Ho multi-module esperto, e cerco di evitare l'installazione del database nel modulo di servizio (come già caricato con i test del modulo dataaccess) e non funziona per me! –

+2

Questo ha funzionato per me! Grazie. Per essere chiari, senza l'annotazione @ContextHierarchy, molla carica il mio db per ogni test. Sto usando il parametro "classes": @ContextConfiguration (classes = {JpaConfigTest.class, ... – Brel

+4

Qualche idea se questo può essere fatto completamente tramite annotazioni invece di usare un XML per la definizione del contesto? Ho cercato molto su nel doc e qui su SO ma non ho trovato nulla che mi induca a pensare che non sia possibile –

Problemi correlati