弹簧靴:@TestConfiguration在集成测试期间不覆盖Bean

2022-08-31 14:39:22

我在一个类中定义了:Bean@Configuration

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

我有一个装饰的类,应该覆盖这个:@TestConfigurationBean

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

Bean 用于设置外部文件的路径,该文件包含启动期间必须读取的注册码。它用于类:configPath@Component

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

在尝试调试时,我在每个方法以及测试配置类的构造函数中设置了一个断点。的构造函数断点被命中,所以我知道我的测试配置类实例化,但是该类的方法永远不会被命中。相反,正常类的方法被命中,并且 in 总是而不是预期的 。@TestConfigurationconfigPathconfigPath@Configuration@AutowiredStringMyParsingComponent../production/environment/path/test/environment/path

不知道为什么会发生这种情况。任何想法将不胜感激。


答案 1

如 Spring Boot 参考手册的“检测测试配置”部分所述,在带注释 的顶级类中配置的任何 Bean 都不会通过组件扫描来获取。因此,您必须显式注册您的类。@TestConfiguration@TestConfiguration

您可以通过测试类或在测试类上执行此操作。@Import(MyTestConfiguration.class)@ContextConfiguration(classes = MyTestConfiguration.class)

另一方面,如果带注释的类是测试类中的嵌套类,则会自动注册。@TestConfigurationstatic


答案 2

确保@Bean工厂方法的方法名称与任何现有 Bean 名称都不匹配。我在方法名称上遇到了问题,例如config()或(在我的情况下)prometheusConfig()与现有bean名称冲突。Spring默默地跳过了这些工厂方法,只是不调用它们/不实例化bean。

如果要在测试中重写 Bean 定义,请在 @Bean(“beanName”) 注释中显式使用 Bean 名称作为字符串参数。


推荐