【问题标题】:SpringBoot Container in Junit TestJunit 测试中的 SpringBoot 容器
【发布时间】:2019-02-22 04:37:39
【问题描述】:

在使用 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 并自动装配控制器类然后测试返回了正确的结果。 这是怎么发生的?

【问题讨论】:

  • 我使用 @MockBean 注释服务并使用 TestRestTemplate 来测试控制器。

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


【解决方案1】:

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

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

【讨论】:

  • 我只是想做一个单元测试,所以一个简单的模拟不应该就足够了,加上我模拟了服务,那么为什么模拟的对象没有在我的 willReturn 中返回对象
猜你喜欢
  • 1970-01-01
  • 2018-07-06
  • 2021-08-04
  • 2019-11-27
  • 1970-01-01
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
相关资源
最近更新 更多