Я использую Test Containers для создания различных Docker-контейнеров для интеграционного тестирования. Вместо использования @ClassRule
в JUnit я решил использовать синглтон-бины для каждого GenericContainer
. Причина этого в том, что Spring кэширует контексты между тестами, и это кэширование значительно ускоряет сборки. Вместо воссоздания контейнеров для каждого тестового класса (~ 45 раз в настоящее время) контейнеры будут воссозданы только тогда, когда необходимо воссоздать контекст (~ 6 раз в настоящее время).
Мы используем Spring Cloud, и чтобы Spring Cloud использовал контейнерный config-сервер в качестве источника конфигурации, все контейнеры должны быть созданы в bootstrap
ApplicationContext Spring Cloud вместо testcontext (создается с помощью SpringJUnit4ClassRunner
).
Это работает нормально, пока контекст не загрязнен (либо путем явного вызова @DirtiesContext
, либо с помощью Mock и т. Д.). Testcontext не закрывает родительский контекст bootstrap
, а просто запускает новый. Ни один из контекстов bootstrap
не будет закрыт до тех пор, пока не будут выполнены все тесты, что приведет к скоплению неиспользованных контейнеров и, в конечном итоге, к исчерпанию системных ресурсов.
Это, вероятно, всего лишь пробел в моих знаниях, но я нахожу странным, что для ApplicationContext правильно установлен родительский элемент для начальной загрузки, но MergedContextConfiguration
имеет родительский элемент, равный нулю в ContextCache
.
Похоже, MergedContextConfiguration
можно настроить только через ContextHierarchy
(если вы хотите установить родителей), но я не нашел правильной конфигурации для установки тестового контекста на дочерний элемент контекста начальной загрузки Spring Cloud.
Вот пример приложения, показывающего проблему: https://github.com/ioben/example-integration-test-issue
У меня есть одно возможное решение в ветви possible-fix-1
, которое регистрирует ApplicationListener для прослушивания ContextClose и закрытия его родительского контекста, если это контекст начальной загрузки. Есть ли лучший способ сделать это, хотя?