当前位置: 首页 > 知识库问答 >
问题:

Spring boot:@TestConfiguration在集成测试期间不重写Bean

顾高翰
2023-03-14
@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";
    }
}

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

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

在尝试调试时,我在每个方法以及test config类的构造函数中设置了一个断点。@TestConfiguration的构造函数断点被命中,因此我知道我的测试配置类实例化了,但是该类的ConfigPath方法从未被命中。相反,正常的@configuration类的configPath方法被点击,MyParsingComponent中的@autowired字符串总是../production/environment/path而不是预期的/test/environment/path

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

共有1个答案

黎震博
2023-03-14

正如Spring Boot reference手册的Detecting Test Configuration一节所述,在用@TestConfiguration注释的顶级类中配置的任何bean都不会通过组件扫描获得。因此,必须显式注册@TestConfiguration类。

您可以通过测试类的@import(MyTestConfiguration.class)@contextConfiguration(classes=MyTestConfiguration.class)来完成此操作。

另一方面,如果用@TestConfiguration注释的类是测试类中的静态嵌套类,那么它将自动注册。

 类似资料:
  • 最后是MockRestTemplateConfiguration

  • 应用程序类文件: 集成测试:

  • 我有一些集成测试是这样的: 和下面这样的测试: 我希望能够抵消时钟bean在一天的不同时间运行一些测试。我该怎么做? 但那里什么都没发生。我需要@import什么吗?我需要自动连线吗? 谢谢!

  • 与@mockbean和@spybean一样,有没有类似于@fakebean/@dummybean的东西? 其思想是,该实例是100%真实的(具有预期的生产内部状态),并且它覆盖(或者添加bean,以防在配置中没有声明)上下文中的bean。理想情况下,您不需要创建TestConfiguration类并将其设置为Primary,因为这样可以在每个测试的基础上控制假冒,只有在需要时才可以。否则它使用主的

  • 已删除MyTestConfig.class,但问题仍然相同。即使我使用@SpringBootTest(classes={Application.Class,MyProblematicServiceImpl.Class}),它仍然在自动连线的地方返回模拟对象。MyProblematicServiceImpl是用@Service注释的空类。