Использование тестовых контейнеров в качестве компонентов в контексте начальной загрузки Spring Cloud - PullRequest
0 голосов
/ 16 января 2019

Я использую 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 и закрытия его родительского контекста, если это контекст начальной загрузки. Есть ли лучший способ сделать это, хотя?

...