Java Junit测试中的SpringBoot容器

Java Junit测试中的SpringBoot容器,java,unit-testing,spring-boot,mockito,junit4,Java,Unit Testing,Spring Boot,Mockito,Junit4,在使用JUnit进行测试时,我无法理解一些事情,我已经编写了一些测试,而有些测试似乎只使用JUnit @RunWith(MockitoJUnitRunner.class) 及 有些似乎无法与他们合作,因此我不得不使用 @RunWith(SpringRunner.class) 及 我知道@MockBean用于处理Spring容器,而@Mock仅用于复制/模拟某个类及其方法。但是使用@MockBean的最佳时机是什么呢 @Test public void addBulkFcmLog()

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

@RunWith(MockitoJUnitRunner.class)

有些似乎无法与他们合作,因此我不得不使用

@RunWith(SpringRunner.class)

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

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

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

我使用@MockBean注释服务,并使用TestRestTemplate测试控制器。我只是想做一个单元测试,所以普通的模拟不应该足够,加上我模拟了服务,那么为什么模拟对象没有在我的willReturn中返回对象呢
@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());

    }