Метод "perform" (Класс "MockMvc") делает запрос на "URL" с пустым "body"

Всем доброго времени суток.
Мне понадобилось написать тесты на @Controller. Для этих тестов я решил воспользоваться функционалом "Mockito". К сожалению, мои тесты отрабатывают не так, как я бы того хотел. Вот что у меня есть:

Контроллер:

@PostMapping("/nsi/organizations")
@ResponseBody
@ResponseStatus(HttpStatus.OK)
public DatareonIngoingMessage<DocumentHeader> nsiOrganizations
       (@RequestBody DatareonIngoingMessage<AscuNSI> message){

    log.info("Got organizations GPN: {}", message);
    return datareonService.process(message);
}

Тест для контроллера (А именно - метод "perform"):

MvcResult actual = mockMvc
     .perform(post("/api/v1/fromAscu/nsi/organizations")
          .contentType(MediaType.APPLICATION_JSON)
          .content(objectMapper.writeValueAsString(message)))
     .andExpect(status().isOk())
     .andReturn();

Проблема:
Когда я запускаю тест в режиме дебага, я вижу следующие шаги (IDEA: StepOver / F8):

  1. Я дохожу до строчки:
.content(objectMapper.writeValueAsString(message)))

На этом моменте, у меня есть корректное "message" со всеми данными. Я могу это видеть при помощи функционала дебагера. Как мне кажется, следующим шагом должна быть строчка:

.andExpect(status().isOk())

Однако, если я нажимаю "F8" - я перемещаюсь на строчку:

.perform(post("/api/v1/fromAscu/nsi/organizations")

А следующим шагом у меня открывается мой контроллер, но его "@RequestBody DatareonIngoingMessage message" - пустой. Т.е. тело запроса, пришедшего в контроллер - null. И далее, если пройти до конца теста, то результатом у меня будут сплошные "null"-значения, словно я отправил пустой запрос на свой URL.

Я попытался найти подобную проблему, но мои поиски не увенчались успехом. Я пробовал добавлять кодировку / менять тип в "MediaType" / создавать более простые тесты (Из разряда, вернётся ли строка если обратиться по определённому URL) и они отрабатывали.

Буду очень благодарен за помощь в решении этого вопроса.


Ответы (1 шт):

Автор решения: Nikolay Ivanov

Вопрос закрыт.
Проблема была не в тестах и их написании, а в дизайне класса "DatareonIngoingMessage". В тесте он фигурирует, как объект с именем "message". Класс был так написан, что, в случае, когда в него приходят не до конца корректные данные - он присваивает своим же полям "null".

К сожалению, у меня не было возможности исправить сам класс, поэтому я воспользовался аннотацией @JsonInclude(JsonInclude.Include.NON_NULL). После установки этой аннотации - тесты прошли в обычном режиме.

→ Ссылка