在使用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并自动连接了控制器类然后测试返回正确的结果。 这是怎么发生的?
答案 0 :(得分:1)
在集成测试环境中,建议始终使用bean(必要时可进行模拟)。需要牢记的几点:
@MockBean
负责注入对象,您无需自己设置。@Qualifier
,则测试将在启动时暴露该问题。@MockBean
比普通的@Mock
setters
,而手动注入将非常困难。