Контейнер SpringBoot в тесте Junit

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

Я использовал аннотацию сервиса с помощью @MockBean и TestRestTemplate для тестирования контроллера.

balaaagi 22.02.2019 06:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
145
1

Ответы 1

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

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

Я просто пытаюсь выполнить модульный тест, поэтому простого макета не должно быть достаточно, плюс я издевался над службой, так почему же издевательский объект не возвращает объект в моем willReturn

Mohendra Amatya 23.02.2019 10:25

Другие вопросы по теме