Spring MockMVC для почтового запроса и проверки бина - PullRequest
0 голосов
/ 03 июля 2019

У меня общая проблема при тестировании пост-запроса с проверкой бина.

Требования : ContentType имеет значение APPLICATION_FORM_URLENCODED, а НЕ JSON

Тестируемая модель:

public class Message extends Auditable{

    @Id
    private long id;    
    private String messageText;
    @NotNull
    private Link link;
}

Как это работает в браузере: Я просто отправляю данные. В браузере Dev-Tools я вижу, что браузер отправляет только для полей: messageText = "мое сообщение" и ссылка = "1"

проблема : во время пост-запроса MockMVC я не могу преобразовать значение параметра "1" в объект Link.

   this.mockMvc.perform(MockMvcRequestBuilders.post("/links/link/comments")
                                                    .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                                                    .param("link", "1")
                                                    .param("messageText", "hello message"))

                    .andDo(print())
                    .andExpect(status().is3xxRedirection());

}

Мой пост-обработчик на контроллере

@PostMapping(value = "/link/message")
public String saveNewComment(@Valid Message message, BindingResult bindingResult, RedirectAttributes attributes) {      

    if(bindingResult.hasErrors()) {                         
            model.addAttribute("newMessage", message);
            return "link/submit";
    } 
}

BindingResult жалуется на TypeMismatch от «String» до «Link».

Как я могу передать какой-то объект Marschal или Converter, который позволяет BindingResult преобразовать строковое значение в соответствующий объект?

Я не хочу реализовывать на стороне сервера собственный объект-валидатор (который реализует интерфейс валидатора), потому что на производстве он работает правильно без какого-либо дополнительного кода.

1 Ответ

0 голосов
/ 05 июля 2019

Я решил эту проблему самостоятельно с небольшим исправлением. Вложенные объекты должны параметризоваться с помощью explizit field-name. Вместо param ("link", "1") это должен быть param ("link.id", "1")

...