Есть ли способ передать весь объект формы на mock-запрос при интеграции тестирования веб-приложения spring mvc? Все, что я могу найти, состоит в том, чтобы передать каждое поле отдельно как param:
mockMvc.perform(post("/somehwere/new").param("items[0].value","value"));
Это хорошо для небольших форм. Но что, если мой размещенный объект станет больше? Кроме того, он делает тестовый код более приятным, если я могу просто разместить весь объект.
В частности, я хотел бы проверить выбор нескольких элементов, установив флажок, а затем разместив их. Конечно, я мог бы просто протестировать публикацию одного элемента, но мне было интересно..
Мы используем spring 3.2.2 с включенным spring -test-mvc.
Моя модель для формы выглядит примерно так:
NewObject {
List<Item> selection;
}
Я пробовал такие вызовы:
mockMvc.perform(post("/somehwere/new").requestAttr("newObject", newObject)
к контроллеру, например:
@Controller
@RequestMapping(value = "/somewhere/new")
public class SomewhereController {
@RequestMapping(method = RequestMethod.POST)
public String post(
@ModelAttribute("newObject") NewObject newObject) {
// ...
}
Но объект будет пустым (да, я его заполнил до этого в тесте)
Единственное работающее решение, которое я нашел, это использовать @SessionAttribute следующим образом: Тестирование интеграции spring Приложения MVC: формы
Но мне не нравится идея помнить, что нужно позвонить в конце каждого контроллера, где мне это нужно. После того, как все данные формы не должны быть внутри сеанса, мне нужно только это для одного запроса.
Итак, единственное, что я могу сейчас подумать, это написать некоторый класс Util, который использует MockHttpServletRequestBuilder для добавления всех полей объекта в виде .param с использованием отражений или индивидуально для каждого тестового примера.
Я не знаю, feeld un-intuitive..
Любые мысли/идеи о том, как я мог бы сделать мою работу проще? (Помимо прямого вызова контроллера напрямую)
Спасибо!