Повторное использование контекста приложения 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 для создания проекта.

907   2  

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

    Ничего не найдено.