Junit测试中的SpringBoot容器

时间:2019-02-22 04:37:40

标签: java unit-testing spring-boot mockito junit4

在使用JUnit进行测试时,我无法理解一些事情,我编写了一些测试,而其中一些似乎可以简单地工作

@RunWith(MockitoJUnitRunner.class)

@Mock

有些似乎无法与它们配合使用,因此我必须使用

@RunWith(SpringRunner.class)

@MockBean

我知道@MockBean是在处理Spring容器时使用的,而@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并自动连接了控制器类然后测试返回正确的结果。 这是怎么发生的?

1 个答案:

答案 0 :(得分:1)

在集成测试环境中,建议始终使用bean(必要时可进行模拟)。需要牢记的几点:

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