Я не могу понять несколько вещей во время тестирования с 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());
}
Выше приведен тест, который я написал для контроллера в своем весеннем загрузочном приложении, но когда я издеваюсь над классом fcmService с помощью @Mock, ответ приходит с пустым телом, но затем я изменил его на @MockBean и автоматически подключил класс контроллера, после чего тест вернулся правильный результат. Как это произошло?




В контексте интеграционного тестирования всегда рекомендуется работать с bean-компонентами (при необходимости с имитацией). Несколько моментов, о которых следует помнить:
@MockBean позаботится об инъекции объекта, вам не нужно устанавливать его самостоятельно.@Qualifier), тест выявит эту проблему при запуске.@MockBean приближает вас к обычному @Mocksetters, и ручная инъекция была бы просто сложной.Я просто пытаюсь выполнить модульный тест, поэтому простого макета не должно быть достаточно, плюс я издевался над службой, так почему же издевательский объект не возвращает объект в моем willReturn
Я использовал аннотацию сервиса с помощью @MockBean и TestRestTemplate для тестирования контроллера.