2016-11-26 10 views
0

Большая часть моего опыта создания контроллеров с Spring - для контроллеров REST, которые потребляют отформатированные запросы JSON. Я искал документацию о том, как сделать тестирование для отправки формы, и до сих пор это, как я понимаю, он должен идти с помощью MockMvc:Как проверить отправку формы с помощью теста Spring MVC?

MvcResult result = mockMvc.perform(post("/submit") 
       .param('title', 'test title') 
       .param('description', 'test description')) 
       .andReturn() 

Однако, я не уверен, как отобразить параметры формы к объекту модели. Я видел, что аннотации @ModelAttribute появляются в моих поисках, но я не могу понять, как его использовать для сопоставления. Кроме того, this quick start guide из официальной документации не уточняет, как такие вещи, как th:object и th:field, переходят на HTML и впоследствии в кодированную форму URL.

У меня есть код контроллера, подобный следующему:

@PostMapping('/submit') 
def submit(@ModelAttribute WriteUp writeUp) { 
    //do something with writeUp object 
    'result' 
} 

ответ

0

Я обнаружил через пробную версию и ошибку, что моя конкретная проблема, возможно, была связана с Groovy. Получается, что тестовый код и код контроллера не имеют проблем. Чтобы повторить, для подачи заявки на тестирование используйте метод param с помощью метода perform от MockMvcRequestBuilders. Другое дело, что это не работает, если тип содержимого не указан. Вот пример тестового кода, который работает для меня:

MvcResult result = webApp.perform(post("/submit") 
     .contentType(APPLICATION_FORM_URLENCODED) //from MediaType 
     .param('title', 'test title') 
     .param('description', 'test description')) 
     .andReturn() 

Как вы можете видеть, это не сильно отличается от того, что я написал первоначально. Код контроллера практически такой же: @ModelAttribute работает отлично.

Проблема с моей установки, хотя в том, что , так как я использовал Groovy, я предположил, что методы получения и установки автоматически генерируются в моем WriteUp классе. Вот как WriteUp класс выглядел первоначально:

class WriteUp { 
    private String title 
    private String description 
} 

Я не написанный код в Groovy некоторое время, и в последний раз, когда я сделал, такие классы, как один из приведенных выше можно предположить, что есть методы получения и установки неявно. Однако оказывается, что это не так. Чтобы решить мой конкретный вопрос, я обновил модификатор доступа в поле, чтобы быть default (уровень пакета):

class WriteUp { 
    String title 
    String description 
} 
0

Я видел @ModelAttribute аннотацию всплывают в моих поисках, но я не могу понять, как она должна быть использована для отображение.

Когда вы отмечаете свой writeUp объект @ModelAttribute, то весна контейнер населяет параметры (как title, description и т.д ..) от HttpServletRequest объекта & впрыскивает объект в метод контроллера, когда поступает запрос на сервер от клиента (может быть Браузер или MockMvc единичный тестовый клиент или что-то еще).

Кроме того, некоторые другие основные моменты для вашего быстрого понимания:

(1) Controller методы сопоставляется с URI и RequestMethod (например, POST/GET/DELETE/PUT и др ..), как показано ниже:

@RequestMapping(value="/submit", method=RequestMethod.POST) 
    public String submit(@ModelAttribute WriteUp writeUp) { 

     //Call the service and Save the details 

     model.addAttribute("Writeup details added successfully"); 

     return "writeUpResult"; //Returns to the View (JSP) 
    } 

(2) @ModelAttribute будет отображаться на объект (например, ваш writeUp) для HTTP-запросов POST/PUT, где HTML formd данных является частью HTTP тела.

(3) @RequestParam или @PathParam будет использоваться для HTTP-запросов GET, где параметры являются частью URL-адреса (т. Е. Не являются частью тела http).

Вы можете посмотреть here для понимания обработки запроса DispatcherServlet & Spring MVC basic web flow.

+0

Я предполагаю, что моя главная забота сейчас как форма HTML должен быть, как для отображения ModelAttribute в работайте правильно. В моем примере кода у меня есть заголовок и параметры описания. –

+0

Вы можете сослаться на простой пример: http://www.mkyong.com/spring-mvc/spring-mvc-form-handling-example/ – developer

+0

Важный вопрос: после всего, как я могу проверить контроллер ? Какая часть 'MockMvcRequestBuilder' может имитировать создание атрибута модели, связанного с обработчиком отправки? –