Повторно использовать контекст приложения Spring в тестовых классах Junit - PullRequest
71 голосов
/ 14 декабря 2011

У нас есть несколько тестовых случаев 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 ]

80 голосов
/ 14 декабря 2011

Да, это вполне возможно.Все, что вам нужно сделать, это использовать один и тот же атрибут locations в ваших тестовых классах:

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

Spring кэширует контексты приложения с помощью атрибута locations, поэтому, если тот же locations появляется во второй разSpring использует тот же контекст, а не создает новый.

Я написал статью об этой функции: Ускорение интеграционных тестов Spring .Также это подробно описано в документации Spring: 9.3.2.1 Управление контекстом и кэширование .

Это имеет интересный смысл.Поскольку Spring не знает, когда будет выполнен JUnit, он кэширует весь контекст forever и закрывает их с помощью ловушки завершения работы JVM.Такое поведение (особенно когда у вас много тестовых классов с разными locations) может привести к чрезмерному использованию памяти, утечкам памяти и т. Д. Еще одно преимущество контекста кэширования.

25 голосов
/ 11 апреля 2014

Чтобы добавить к ответ Томаша Нуркевича , начиная с Spring 3.2.2 @ContextHierarchy, можно использовать аннотацию, чтобы иметь отдельную, связанную многоконтекстную структуру.Это полезно, когда несколько тестовых классов хотят совместно использовать (например) настройки базы данных в памяти (источник данных, EntityManagerFactory, менеджер tx и т. Д.).

Например:

@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 (поиск " контекстная иерархия ")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...