Java Junit测试中的SpringBoot容器
在使用JUnit进行测试时,我无法理解一些事情,我已经编写了一些测试,而有些测试似乎只使用JUnitJava 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()
@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
@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());
}