我在与junit进行测试时无法理解几件事,我已经写了一些测试,而有些则似乎简单地与
一起使用@RunWith(MockitoJUnitRunner.class)
和
@Mock
有些人似乎不适合他们,所以我必须使用
@RunWith(SpringRunner.class)
和
@MockBean
我知道,在处理弹簧容器时,使用@mockbean,而@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类时,响应随身带有一个空白然后测试返回正确的结果。这是怎么发生的?
在集成测试上下文中始终建议与bean一起使用(如有必要,请嘲笑)。几点要记住:
-
@MockBean
照顾注入对象,您无需自己设置。 - 如果您的配置是错误的(例如,您没有指定
@Qualifier
),则测试将在启动上暴露该问题。 - 在集成测试中,您希望将系统处于尽可能接近产品的状态,而
@MockBean
比普通的@Mock
更接近您 - 很多时候,豆子依赖性没有
setters
,手动注射将很难。