Можно ли добавить сообщение подтверждения при использовании Mock Mvc? - PullRequest
3 голосов
/ 09 июля 2020

В большинстве случаев вместо добавления комментариев в обычное утверждение JUnit мы добавляем сообщение к утверждению, чтобы объяснить, почему это утверждение находится там, где оно находится:

Person p1 = new Person("Bob");
Person p2 = new Person("Bob");
assertEquals(p1, p2, "Persons with the same name should be equal.");

Теперь, когда доходит до тестирования конечной точки в веб-среде Spring Boot. Я получаю следующее:

// Bad request because body not posted
mockMvc.perform(post("/postregistration")).andExpect(status().isBadRequest());

// Body posted, it should return OK
mockMvc.perform(post("/postregistration").content(toJson(registrationDto))
        .andExpect(status().isOk()));

Есть ли способ избавиться от комментариев и добавить сообщение к подобному утверждению? Итак, если тест не пройден, я увижу сообщение.

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Вы можете предоставить собственный ResultMatcher:

mockMvc.perform(post("/postregistration")
        .content(toJson(registrationDto))
        .andExpect(result -> assertEquals("Body posted, it should return OK", HttpStatus.OK.value() , result.getResponse().getStatus())))

mockMvc.perform(post("/postregistration"))
       .andExpect(result -> assertEquals("Bad request because body not posted", HttpStatus.BAD_REQUEST.value(), result.getResponse().getStatus()));

Explaination :

На сегодняшний день метод .andExpect() принимает только один ResultMatcher. Когда вы используете .andExpect(status().isOk()), класс StatusResultMatchers создаст ResultMatcher следующим образом:

public class StatusResultMatchers {
    //...
    public ResultMatcher isOk() {
        return matcher(HttpStatus.OK);
    }
    //...
    private ResultMatcher matcher(HttpStatus status) {
        return result -> assertEquals("Status", status.value(), result.getResponse().getStatus());
    }
}

Как вы можете видеть, сообщение жестко запрограммировано на «Статус», и нет другого встроенного метода для настройки Это. Таким образом, несмотря на то, что предоставление настраиваемого ResultMatcher немного многословно, на данный момент это может быть единственный возможный способ использования mock Mvc.

1 голос
/ 09 июля 2020

Я понял, что assertDoesNotThrow отвечает, следовательно, улучшает ситуацию (согласно тому, что я спрашиваю):

assertDoesNotThrow(() -> {
    mockMvc.perform(post("/postregistration")).andExpect(status().isBadRequest());
}, "Bad Request expected since body not posted.");
...