代码之家  ›  专栏  ›  技术社区  ›  The Head Rush

spring boot:@testconfiguration在集成测试期间不重写bean

  •  18
  • The Head Rush  · 技术社区  · 8 年前

    我有一个 Bean 在用@configuration修饰的类中定义:

    @Configuration
    public class MyBeanConfig {
    
        @Bean
        public String configPath() {
            return "../production/environment/path";
        }
    }
    

    我有一个用@testconfiguration修饰的类,它应该覆盖这个 豆 :

    @TestConfiguration
    public class MyTestConfiguration {
    
        @Bean
        @Primary
        public String configPath() {
            return "/test/environment/path";
        }
    }
    

    这个 configPath be an用于设置外部文件的路径,该文件包含在启动期间必须读取的注册代码。它用于@component类:

    @Component
    public class MyParsingComponent {
    
        private String CONFIG_PATH;
    
        @Autowired
        public void setCONFIG_PATH(String configPath) {
            this.CONFIG_PATH = configPath;
        }
    }
    

    在尝试调试时,我在每个方法以及测试配置类的构造函数中设置了一个断点。这个 @TestConfiguration 的构造函数断点被命中,因此我知道我的测试配置类实例化,但是 configPath() 该类的方法从未被命中。取而代之的是 配置路径() 方法调用了normal@configuration类的 @Autowired String 在里面 MyParsingComponent 总是 ../production/environment/path 而不是预期的 /test/environment/path .

    不知道为什么会这样。任何想法都将不胜感激。

    2 回复  |  直到 8 年前
        1
  •  36
  •   kellyfj    7 年前

    如文件所述 Detecting Test Configuration 在spring boot参考手册的一节中,在顶级类中配置的任何bean都用 @TestConfiguration 将 不 通过组件扫描来获取。所以你必须明确地注册 @测试配置 班级。

    你也可以通过 @Import(MyTestConfiguration.class) 或 @ContextConfiguration(classes = MyTestConfiguration.class) 在你的测试课上。

    另一方面,如果您的类用 是一个 static 嵌套类 在内部 你的测试类会自动注册。

        2
  •  4
  •   Marcel Thimm    7 年前

    确保@bean factory方法的方法名与任何现有的bean名都不匹配。我对方法名有意见,比如 配置() 或者(对我来说) prometheusconfig() 与现有的bean名称冲突。spring跳过了那些工厂的方法 默默地 只是不调用它们/不实例化bean。

    如果要重写测试中的bean定义,请在@bean(“bean name”)注释中将bean名称显式地用作字符串参数。