2011-12-14 10 views
54

Mamy kilka przypadków testowych JUnit (testy integracji) i są one logicznie pogrupowane w różne klasy testowe.Ponowne użycie kontekstu aplikacji wiosennych w klasach testów junit

Jesteśmy w stanie załadować Wiosna kontekstu aplikacji raz w klasie testowej i ponownie go używać do wszystkich przypadków testowych w klasie testu JUnit jak wspomniano w http://static.springsource.org/spring/docs/current/spring-framework-reference/html/testing.html

Jednak, byliśmy po prostu zastanawiałem się, czy istnieje sposób, aby wczytaj kontekst aplikacji Spring tylko raz dla kilku klas testowych JUnit.

FWIW, używamy Spring 3.0.5, JUnit 4.5 i używamy Mavena do zbudowania projektu.

+0

Wszystkie poniższe odpowiedzi są świetne, ale nie mają context.xml. Czy zanotowałem moją drogę do zapomnienia? W jaki sposób można to zrobić bez pliku context.xml? – markthegrea

Odpowiedz

67

Tak, jest to całkowicie możliwe. Wszystko co musisz zrobić, to użyć tego samego atrybutu locations w klasach Test:

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

Wiosna kontekstów aplikacji buforuje przez atrybut locations więc jeśli ten sam locations pojawia się po raz drugi, Wiosna wykorzystuje ten sam kontekst zamiast tworzenia nowy.

Napisałem artykuł na temat tej funkcji: Speeding up Spring integration tests. Również jest to opisane szczegółowo w dokumentacji Spring: 9.3.2.1 Context management and caching.

Ma to interesujące znaczenie. Ponieważ Spring nie wie, kiedy JUnit jest zakończony, buforuje cały kontekst na zawsze i zamyka je za pomocą haka zamykającego JVM. To zachowanie (szczególnie gdy masz wiele klas testowych z różnymi locations) może prowadzić do nadmiernego użycia pamięci, przecieków pamięci itp. Kolejną zaletą kontekstu buforowania.

+0

Ah! Nie zdawałem sobie z tego sprawy. Od dawna stosujemy to podejście i (błędnie) przypisałem długi czas wykonywania testów do kontekstowego ładowania wiosennego z każdą klasą testową. Będę teraz dokładnie sprawdzać. Dzięki. – Ramesh

+0

Powiedziałbym raczej, że ta wiosna nie ma żadnej wiedzy na temat kolejności wykonywania twoich testcases. W wyniku tego nie można stwierdzić, czy kontekst jest wymagany później, czy można go usunąć. – philnate

+1

Nie widzę, jak to może być prawdą. Eclipse/JUnit spędza 2 minuty uruchamiając środowisko za każdym razem, gdy wykonuję test Run As/JUnit. Tak się nie stanie, jeśli cokolwiek zostanie zapisane w pamięci podręcznej. – user1944491

22

Aby dodać do Tomasz Nurkiewicz's answer, od wiosny 3.2.2 @ContextHierarchy adnotację można wykorzystać do utworzenia oddzielnej, powiązanej struktury wielu kontekstów. Jest to pomocne, gdy wiele klas testowych chce współdzielić (na przykład) ustawienia bazy danych w pamięci (źródło danych, EntityManagerFactory, menedżer tx itp.).

Na przykład:

@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 { 
... 
} 

Poprzez tę konfigurację kontekst, który wykorzystuje „test-db-setup-context.xml” zostanie utworzony tylko raz, ale fasola wewnątrz może być wstrzykiwany do indywidualna jednostka testy na kontekst

Więcej o instrukcji: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html#testcontext-ctx-management (wyszukiwanie „context hierarchy”)

+0

Mam multi-moduł maven, i staram się unikać konfiguracji bazy danych w module serwisowym (jak już załadowane testy modułu danych) i to nie działa dla mnie! –

+2

To zadziałało dla mnie! Dzięki. Dla jasności, bez adnotacji @ContextHierarchy, wiosna ładuje moje db do każdego testu. Używam "classes" param: @ContextConfiguration (classes = {JpaConfigTest.class, ... – Brel

+4

Każdy pomysł, jeśli można to w pełni wykonać za pomocą adnotacji zamiast używać XML do definicji kontekstu? to w dokumencie i tutaj na SO, ale nie może znaleźć niczego, co prowadzi mnie do myślenia, że ​​nie jest to możliwe –

Powiązane problemy