【问题标题】:Not able to prevent couchbase autoconfiguration during tests在测试期间无法阻止 couchbase 自动配置
【发布时间】:2021-05-20 01:59:09
【问题描述】:

我试图阻止应用程序在运行单元测试时尝试连接到数据库。以下是我所做的。

@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
  

两者都没有帮助。 有人可以帮我理解这里出了什么问题吗?

【问题讨论】:

    标签: spring-boot spring-data couchbase spring-boot-test spring-data-couchbase


    【解决方案1】:

    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, MessageApplication.class , CouchBaseConfiguration.class }))
    public class MessageApplicationTests {
    
        @MockBean
        Repositoryclass repoBean;
    
    

    【讨论】:

      【解决方案2】:

      spring-data-couchbase 项目测试提供了一个模拟 couchbase 服务器(src/test/resources/integration.properties -> 已模拟)或可以使用独立的 couchbase 服务器(非托管)。这可能对您的测试有用。

      【讨论】:

        【解决方案3】:

        同时排除您的 Config 类(扩展 AbstractCouchbaseConfig 的类) 但是,如果您对存储库有任何引用,例如通过 Autowire 或作为 @Service 构造函数的参数,应用程序将无法启动。当我尝试时,自动配置类的排除似乎并不重要。

        @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 excludes 在两个类上完全排除它们(尽管我发现排除并没有改变任何东西)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-02-28
          • 1970-01-01
          • 2019-09-05
          • 2015-12-24
          • 1970-01-01
          • 1970-01-01
          • 2014-07-30
          • 1970-01-01
          相关资源
          最近更新 更多