java - 测试 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);
}
}
解决方案
答案比我想象的要简单。将 MockBean 添加到
@TestConfiguration
public class TestConfig {
@MockBean
private MyRunner myRunner;
}
我们可以使用 @MockBean 将模拟对象添加到 Spring 应用程序上下文中。模拟将替换应用程序上下文中任何现有的相同类型的 bean。
所以MyRunner.run()
永远不会被调用,但我仍然可以在我的应用程序中使用所有其他 bean。