【问题标题】:Spring boot: inject mock into Runner classSpring Boot:将模拟注入 Runner 类
【发布时间】:2017-07-03 09:05:56
【问题描述】:

我有一个 Spring Boot 应用程序和其他一些应用程序应该与之交互的组件。但是,在我的单元测试中,我只使用应用程序功能,我想模拟外部 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() 方法。

【问题讨论】:

    标签: java spring spring-boot mockito


    【解决方案1】:

    查看 Spring Boot 文档中的 Mocking and spying beans

    您可以在测试类中使用 @MockBean 将自动装配的 bean 替换为 Mockito 模拟实例。

    【讨论】:

      【解决方案2】:

      你可以使用@MockBeanhttp://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下

      【讨论】:

        猜你喜欢
        • 2021-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-16
        • 2018-03-09
        • 1970-01-01
        • 1970-01-01
        • 2012-12-01
        相关资源
        最近更新 更多