【发布时间】: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