首页 > 解决方案 > 测试 Spring Boot 命令行应用程序

问题描述

我想测试我的 Spring Boot 命令行应用程序。我想模拟某些bean(我可以通过@ContextConfiguration(classes = TestConfig.class)在我的测试类的顶部进行注释来做到这一点。在TestConfig.class中,我覆盖了我想模拟的bean。我想Spring Boot找到其余的组件。这个似乎工作。

问题是当我运行测试时,整个应用程序正常启动(即run()调用该方法)。

@Component
public class MyRunner implements CommandLineRunner {

    //fields

    @Autowired
    public MyRunner(Bean1 bean1, Bean2 bean2) {
        // constructor code
    }

    @Override
    public void run(String... args) throws Exception {
        // run method implementation
    }

我试图覆盖MyRunner @Bean并把它放进去TestConfig.class,但这似乎不起作用。我知道我正在加载常规应用程序上下文,但这就是我想做的(我认为?),因为我想重新使用@Component我在我的应用程序中创建的所有(或大部分),并且只模拟一个很小的子集。

有什么建议么?

编辑:

应用程序.java

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

标签: javaspringspring-bootintegration-testing

解决方案


答案比我想象的要简单。将 MockBean 添加到

@TestConfiguration
public class TestConfig {

    @MockBean
    private MyRunner myRunner;

}

我们可以使用 @MockBean 将模拟对象添加到 Spring 应用程序上下文中。模拟将替换应用程序上下文中任何现有的相同类型的 bean。

所以MyRunner.run()永远不会被调用,但我仍然可以在我的应用程序中使用所有其他 bean。


推荐阅读