在Spring Cloud的引导上下文中将测试容器用作Bean

时间:2019-01-16 17:52:18

标签: spring spring-boot spring-cloud

我正在使用测试容器创建用于集成测试的各种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并关闭其父上下文(如果它是引导上下文)。有更好的方法吗?

0 个答案:

没有答案