问题描述
我试图阻止应用程序在运行单元测试时尝试连接到数据库。以下是我所做的。
@SpringBootApplication(exclude = {
CouchbaseDataAutoConfiguration.class,CouchbaseAutoConfiguration.class,})
@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,value = {
ApplicationStartup.class,MessageApplication.class }))
public class MessageApplicationTests {
public static void main(String[] args) {
SpringApplication.run(MessageApplicationTests.class,args);
}
}
@ActiveProfiles("test")
@SpringBoottest(classes = MessageApplicationTests.class)
class TestClass {
@Autowired
Serviceclass serviceclass;
@Test
void testMethod() {
}
}
除此之外,我在 application-test.yml 中添加了以下内容
spring:
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration
- org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration
- org.springframework.cloud.aws.autoconfigure.messaging.MessagingAutoConfiguration
两者都没有帮助。 有人能帮我理解这里有什么问题吗?
解决方法
还要排除您的 Config 类(扩展 AbstractCouchbaseConfig 的类) 但是,如果您对存储库有任何引用,例如通过 Autowire 或作为 @Service 构造函数的 args,应用程序将无法启动。当我尝试时,排除自动配置类似乎无关紧要。
@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,value = { ApplicationStartup.class,MessageApplication.class,Config.class}))
可能与您的问题无关,但我发现使用多个 @SpringBootApplication 类(您有 MessageApplication 和 MessageApplicationTests,对吧?),Spring 会为 两者 遍历自动配置类,不只是
中的那个
SpringApplication.run(MessageApplicationTests.class,args) ) 所以我们需要在两个类上都使用 @SpringBootApplication 排除来完全排除它们(尽管我发现排除没有改变任何东西)。
Michael Reiche 发布的上述答案是正确的。补充几点来解决他提出的问题。
我们需要排除 Couchbase 的配置类。但是自动装配的存储库 bean 会产生问题。
为了解决这个问题,我们可以模拟存储库 bean,这样它就不会尝试创建实际的存储库 bean 并将它们加载到上下文中。
在排除列表中不包括自动配置类对我来说很重要,因为它会尝试配置 Couchbase,因为依赖项存在于类路径中
@SpringBootApplication(exclude = {
CouchbaseDataAutoConfiguration.class,CouchbaseAutoConfiguration.class,CouchbaseRepositoriesAutoConfiguration.class,CouchbaseReactiveDataAutoConfiguration.class,CouchbaseReactiveHealthContributorAutoConfiguration.class
})
@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,value = {
ApplicationStartup.class,CouchBaseConfiguration.class }))
public class MessageApplicationTests {
@MockBean
Repositoryclass repoBean;
,
spring-data-couchbase 项目测试提供了一个模拟 couchbase 服务器(src/test/resources/integration.properties -> mocked)或可以使用独立的 couchbase 服务器(非托管)。这可能对您的测试有用。