Контейнер SpringBoot в тесте Junit - PullRequest
0 голосов
/ 22 февраля 2019

Я не могу понять некоторые вещи во время тестирования с помощью 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 и Autowired класс контроллера затем тест вернул правильный результат.Как это случилось?

1 Ответ

0 голосов
/ 22 февраля 2019

В контексте интеграционного теста всегда желательно работать с bean-компонентами (при необходимости проверяется).Несколько моментов, о которых следует помнить:

  • @MockBean заботится о введении объекта, вам не нужно устанавливать его самостоятельно.
  • Если ваша конфигурация неверна (вы не сделали этого)укажите @Qualifier (например)), тест выявляет эту проблему при запуске.
  • В интеграционном тесте вы хотите, чтобы ваша система находилась в состоянии, максимально приближенном к сценарию prod, и @MockBean приближает вас к простому @Mock
  • Во многих случаях у бобовых зависимостей нет setters, и ручное внедрение будет просто сложным.
...