Spring Boot :@TestConfiguration在集成测试期间未覆盖Bean

w8f9ii69  于 2022-11-05  发布在  Spring
关注(0)|答案(7)|浏览(270)

我在一个用@Configuration修饰的类中定义了一个Bean

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

我有一个用@TestConfiguration修饰的类,它应该覆盖这个Bean

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

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

@Component
public class MyParsingComponent {
    private String CONFIG_PATH;

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

在调试的时候,我在每个方法和测试配置类的构造函数中设置了一个断点,@TestConfiguration的构造函数断点被命中,所以我知道我的测试配置类示例化了,但是这个类的configPath方法从来没有被命中。相反,正常@Configuration类的configPath方法被命中,并且MyParsingComponent中的@AutowiredString始终是../production/environment/path而不是预期的/test/environment/path
不知道为什么会发生这种情况。任何想法都将不胜感激。

jaxagkaj

jaxagkaj1#

正如Sping Boot 参考手册的Detecting Test Configuration一节中所述,任何在顶层类中配置了@TestConfiguration注解的bean都不会通过组件扫描被拾取。因此,您必须显式地注册您的@TestConfiguration类。
您可以通过测试类上的@Import(MyTestConfiguration.class)@ContextConfiguration(classes = MyTestConfiguration.class)来实现这一点。
另一方面,如果用@TestConfiguration标注的类是测试类 * 内 * 的static嵌套类,则它将自动注册。

7ivaypg9

7ivaypg92#

确保您的@Bean工厂方法的方法名称不与任何现有的bean名称匹配。我遇到了一些问题,比如 config() 或(在我的例子中)prometheusConfig(),它们与现有的bean名称冲突。Spring会静默地跳过这些工厂方法,并且只是不调用它们/不示例化bean。
如果要在测试中覆盖Bean定义,请在@Bean(“beanName”)注解中显式使用Bean名称作为字符串参数。

yqyhoc1h

yqyhoc1h3#

  • 必须通过@Import({MyTestConfiguration.class})在测试中明确导入测试配置。
  • @Configuration@TestConfiguration中的@Bean方法的名称必须不同。至少在Sping Boot v2.2中是不同的。
  • 此外,请确定spring.main.allow-bean-definition-overriding=true,否则无法覆写Bean。
sxpgvts3

sxpgvts34#

对我来说,这个代码:

@TestConfiguration // 1. necessary
  public class TestMessagesConfig {

    @Bean
    @Primary // 2. necessary
    public MessageSource testMessageSource() { // 3. different method name than in production code e.g. add test prefix

    }
  }
3pvhb19x

3pvhb19x5#

我努力解决了一个相关的问题,即使我使用的是内部静态类,我的测试bean也没有注册。
事实证明,您仍然需要将内部静态类添加到@ContextConfiguration类数组中,否则@TestConfiguration中的bean不会被选中。
第一个

egmofgnx

egmofgnx6#

我最近遇到了一个类似的问题,通过用@Primary和@Bean来注解我的测试bean,我解决了这个问题。不知道为什么需要这样做,这似乎没有记录在Spring文档中。我的SpringBoot版本是2.0.3。

eivnm1vs

eivnm1vs7#

在我的例子中,这是@RunWith(SpringRunner.class)的问题,我不确定为什么它不工作,我正在跟踪这个-Testing in Spring Boot
但是在用@ExtendWith(SpringExtension.class)替换它之后,内部静态@TestConfiguration类按预期创建了bean。
可能是版本不匹配-我使用的是Sping Boot 2.7.2。

相关问题