繁体   English   中英

Junit测试中的SpringBoot容器

[英]SpringBoot Container in Junit Test

在使用 JUnit 进行测试时,我无法理解一些事情,我已经编写了一些测试,而有些似乎只是与

@RunWith(MockitoJUnitRunner.class)

@Mock

有些似乎不适合他们,所以我必须使用

@RunWith(SpringRunner.class)

@MockBean

我知道@MockBean 是在处理 Spring Container 时使用的,而 @Mock 只是用来复制/模拟某个类及其方法。 但是使用@MockBean 的最佳时间是什么时候?

@Test
    public void addBulkFcmLog() throws Exception {
        JacksonTester.initFields(this, new ObjectMapper());
        AdminFcmResource adminFcmResource = AdminFcmResource.builder()
                .adminId(123L)
                .build();

        given(this.fcmService.addBulkFcmLog(any(BulkFcmDataResource.class))).willReturn(adminFcmResource);

        MockHttpServletResponse response = mockMvc.perform(
                post(Routes.SEND_FCM + "/admin/logs/add")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(bulkFcmDataResourceJacksonTester.write(BulkFcmDataResource.builder().adminId(123L).build()).getJson()))
                .andExpect(status().isCreated())
                .andReturn()
                .getResponse();

        assertThat(response.getContentAsString()).isEqualTo(
                adminFcmResourceJacksonTester.write(adminFcmResource).getJson()
        );
        assertThat(response.getStatus()).isEqualTo(HttpStatus.CREATED.value());

    }

以上是我在 Spring Boot 应用程序中为控制器编写的测试,但是当我使用 @Mock 模拟 fcmService 类时,响应带有一个空主体,但随后我将其更改为 @MockBean 并自动连接控制器类,然后测试返回正确的结果。 这怎么发生的?

在集成测试上下文中,始终建议使用 bean(必要时模拟)。 要记住的几点:

  • @MockBean负责注入对象,您不需要自己设置它。
  • 如果您的配置错误(例如您没有指定@Qualifier ),则测试将在启动时暴露该问题。
  • 在集成测试中,您希望系统处于尽可能接近生产场景的状态, @MockBean使您比普通的@Mock更接近
  • 很多时候 bean 依赖项没有setters ,手动注入会很困难。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM