我正在使用测试容器创建用于集成测试的各种Docker容器。我决定不对每个GenericContainer
使用单例bean,而不是使用JUnit的@ClassRule
。这样做的原因是因为Spring在测试之间缓存了上下文,并且这种缓存大大加快了构建速度。代替为每个测试类重新创建容器(当前约45次),仅在需要重新创建上下文(当前约6次)时重新创建容器。
我们使用Spring Cloud,为了使Spring Cloud使用容器化的config-server作为配置源,必须全部在Spring Cloud的bootstrap
ApplicationContext中创建容器,而不是在testcontext中创建容器(由SpringJUnit4ClassRunner
。
这很好,直到弄脏上下文为止(通过显式调用@DirtiesContext
或使用Mock等)。 testcontext不会关闭父bootstrap
上下文,而只是启动一个新的上下文。在运行所有测试之前,不会关闭bootstrap
上下文,这会创建一堆未使用的容器,最终耗尽系统资源。
这可能只是我的知识上的空白,但是我感到奇怪的是,ApplicationContext的父级设置正确以进行引导,而MergedContextConfiguration
的父级在ContextCache
中设置为null。 / p>
看来MergedContextConfiguration
只能通过ContextHierarchy
进行配置(如果要设置父级),但是我找不到用于将测试上下文设置为Spring Cloud的子级的正确配置。引导上下文。
以下是显示该问题的示例应用程序:https://github.com/ioben/example-integration-test-issue
我在分支possible-fix-1
中有一个可能的解决方案,该分支注册一个ApplicationListener来侦听ContextClose并关闭其父上下文(如果它是引导上下文)。有更好的方法吗?