Повторное использование контекста приложения spring в тестовых классах junit
У нас есть куча тестов JUnit (интеграционные тесты), и они логически сгруппированы в разные тестовые классы.
мы можем загрузить контекст приложения Spring один раз для каждого тестового класса и повторно использовать его для всех тестовых случаев в тестовом классе JUnit, как указано в http://static.springsource.org/spring/docs/current/spring-framework-reference/html/testing.html
однако нам просто интересно, есть ли способ загрузить контекст приложения Spring только один раз для группы тестовых классов JUnit.
FWIW, мы используем Spring 3.0.5, JUnit 4.5 и используем Maven для создания проекта.
2 ответов:
Да, это вполне возможно. Все, что вам нужно сделать, это использовать тот же
locationsатрибут в тестовых классах:@ContextConfiguration(locations = "classpath:test-context.xml")Spring кэширует контексты приложений по
locationsатрибут так что если жеlocationsпоявляется во второй раз, Spring использует тот же контекст, а не создает новый.я написал статью об этой функции: ускорение весенних интеграционных тестов. Также это подробно описано в весенней документации: 9.3.2.1 управление контекстом и кэширование.
это имеет интересный подтекст. Поскольку Spring не знает, когда JUnit выполняется, он кэширует весь контекст навсегда и закрывает их с помощью JVM shutdown hook. Такое поведение (особенно когда у вас есть много классов с разными
locations) может привести к чрезмерному использованию памяти, утечки памяти и т. д. Еще одно преимущество кэширования контекста.
добавить Томаш Nurkiewicz это, начиная с весны 3.2.2
@ContextHierarchyаннотация может использоваться для создания отдельной, связанной с несколькими контекстами структуры. Это полезно, когда несколько тестовых классов хотят совместно использовать (например) настройки базы данных в памяти (datasource, EntityManagerFactory, TX manager и т. д.).например:
@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 { ... }С помощью этой установки контекст, который использует " test-db-setup-context.xml " будет создан только один раз, но бобы внутри него может быть введен в контекст отдельного модульного теста
подробнее о руководстве: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html#testcontext-ctx-management (поиск "иерархия контекстов")
Comments