我有一个 Spring 启动应用程序和一些应用程序应该与之交互的其他组件。但是,在我的单元测试中,我只使用应用程序功能,我想模拟外部 API 调用。我被困住了,因为我找不到像这样模拟案例的方法:
我使用 main 方法的起始类:
@ComponentScan("com.sample.application")
@SpringBootApplication
public class MyApp implements CommandLineRunner {
@Autowired
private OuterAPI outerAPI;
public static void main(String[] args) {
SpringApplication.run(AdRedirectorMain.class, args);
}
@Override
public void run(String... args) throws Exception {
outerAPI.createInstances();
}
...
}
这是我的测试类示例:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = MyApp.class)
public class MyAppTest {
// any tests
}
我正在使用Spring Boot,JUnit,Mockito。
所以,我面临着这个问题 - 我如何避免这种方法通过反射或任何其他方式使用 Mockito 调用 createInstances((。
看看 Spring Boot 文档中的 Mocking and Spying being
。您可以在测试类中使用@MockBean
将自动连线的 bean 替换为 Mockito 模拟实例。
您可以使用@MockBean
http://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/mock/mockito/MockBean.html
或者你可以定义一个你 OuterAPI 实现的接口,然后对于你的测试,你提供一个虚拟实现,进行虚拟调用而不是实际调用outerAPI.createInstances();
您拥有的另一个选项是具有这样的配置类:
@Configuration
@Profile(value = {"yourtest-profile"})
public class TestConfiguration{
@Primary
@Bean
public OuterAPI outerAPI() {
return Mockito.mock(OuterAPI.class);
}
}
并将其放在 SCR/test/Java 下