如何在组件测试中动态排除Spring Boot配置类

时间:2019-09-12 20:56:39

标签: java spring spring-boot

我使用一堆Spring Boot应用程序。他们有一堆在启动时运行的配置类。每个应用程序都可以使用“ @EnableAutoConfiguration(exclude=...”机制从自动配置中排除某些类。

例如,其中一个应用程序具有以下注释:

@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class,
    CassandraDataAutoConfiguration.class, CassandraRepositoriesAutoConfiguration.class })

这些被排除在外,因为此应用程序不使用那些框架。但是,此应用程序确实使用了Hazelcast,因此该列表中不包含“ HazelcastAutoConfiguration.class”。

每个应用程序还具有“组件”测试,介于单元测试和集成测试之间。他们至少使用以下注释:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

组件测试的重点是测试整个应用程序,但要对网络依赖项进行模拟和存根。在这种情况下,我们必须阻止应用程序进行Hazelcast连接。如果我暂时在排除列表中添加“ HazelcastAutoConfiguration.class”,则组件测试可以正常工作,但是,当然,应用程序将无法正常工作。

我需要某种方法使应用程序在组件测试中排除Hazelcast配置器,但在正常操作中将其包括在内。

我相信我可以通过多种方式来完成此任务。有人可以详细说明我的选择吗?我相信这些选项之一就是“个人资料”,但是我不确定在这里如何工作。

更新

最初,我认为我可以通过执行以下操作来实现此目的:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
            properties = {"spring.autoconfigure.exclude = " +
"org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration"})

但是我发现它仍在呼叫HazelcastClientConfiguration。然后,我发现CacheAutoConfiguration中也引用了此配置类,因此我将该类添加到了排除列表中。这种工作,但现在我得到了:

IllegalStateException: No CacheResolver specified, and no bean of type CacheManager found. Register a CacheManager bean or remove the @EnableCaching annotation from your configuration.

我是财产驱动绳的末端吗?有没有一种最简单的方法可以通过在@SpringBootTest批注中使用测试属性或批注属性来解决此问题?

1 个答案:

答案 0 :(得分:0)

使用配置文件进行测试,方法是使用@ActiveProfiles("test")注释测试,并使用@Profile("!test")注释配置类。

对于库配置类,您可以模拟Bean:

@MockBean
private SomeClass someClass;

有关此主题的更多信息:https://www.baeldung.com/java-spring-mockito-mock-mockbean