Повторное использование весеннего контекста приложения в тестовых classах junit

У нас есть куча тестов JUnit (тесты интеграции), и они логически сгруппированы в разные тестовые classы.

Мы можем загружать контекст приложения Spring один раз на один class тестирования и повторно использовать его для всех тестовых примеров в тестовом classе JUnit, как указано в http://static.springsource.org/spring/docs/current/spring-framework-reference /html/testing.html

Однако нам просто интересно, есть ли способ загрузить Spring-контекст приложения только один раз для кучи тестовых classов JUnit.

FWIW, мы используем Spring 3.0.5, JUnit 4.5 и используем Maven для создания проекта.

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

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

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

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

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

    Чтобы добавить к ответу Томаша Нуркевича , с весны 3.2.2. @ContextHierarchy аннотация может быть использована для отдельной, связанной множественной структуры контекста. Это полезно, когда несколько тестовых classов хотят совместно использовать (например) настройки базы данных в памяти (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 (поиск « контекстной иерархии »)

    Interesting Posts
    Давайте будем гением компьютера.