2016-01-07 2 views
1

Я пытаюсь написать Spring MVC Tests для тестирования контроллеров Spring. В настоящее время, если я хотел проверить метод контроллера с этой подписью:Spring Test MVC: Как использовать объект в качестве параметров запроса

@RequestMapping(value = "/new/save", method = RequestMethod.POST) 
@Transactional 
public String postGateway(@Valid GatewayForm gatewayForm, BindingResult bindingResult, RedirectAttributes flash, Model model) 

Я хотел бы использовать MockMVC таким образом, чтобы заполнить параметр объекта GatewayForm:

mvc.perform(
       post("/new/save") 
         .sessionAttr("account", account) 
         .param("serialNumber", "SN1QRTY334V") 
         .param("branchId", "1") 
         .param("model", "1") 
         .param("templateId", "1") 

Проблема в том, что я могу только установите значения String/primitive на объект GatewayForm, используя метод .param (String, String).

Таким образом, существуют переменные экземпляра объекта на GatewayForm выше, которые я не могу установить. Я видел других людей вместо столбца JSON объекта, но это потребовало бы изменения реализации методов контроллера для использования «application/json», который я не хочу делать.

Может ли кто-нибудь посоветовать?

+2

Вы не должны передавать объект своему контроллеру в тесте интеграции http://stackoverflow.com/a/17143677/1935341 –

+0

Во-вторых, что. Это плохая практика. – horatius

+0

Хорошо, мне кажется, я должен попробовать этот метод postForm() вместо post(). Позвольте мне попробовать именно это –

ответ

0

В комментарии к вопросу указываются, что строки являются по существу входными параметрами HTTP-запросов, целью является преобразование объекта формы в принятую строку.

Глядя на spring-mvc-test-utils library, существует множество стратегий преобразования объекта в строку. Тем не менее, стратегия по умолчанию для преобразования объекта в строку в исходном коде является использование:

String.valueOf(Object object) 

Например мой случай использования должен был передать список в качестве параметров в моей интеграционного тестирования. Мой контроллер принимает объект с атрибутами:

public class MyObjectThatTheControllerExpects {  
    List<SomeEnum> listOfEnums; 
    Long id 
    ... 

Поэтому мои интеграции тестовых сообщений параметров, например так:

mvc 
    .perform(
     post("/some/endpoint") 
      .param("listOfEnums", String.valueOf(SomeEnum.SOMEENUMCONSTANT), String.valueOf(SomeEnum.SOMEOTHERENUMCONSTANT)) 
      .param("id", "100") 

я уверен, что это не может быть целесообразным для более сложных классов. Однако для этого тривиального случая это работает.

Надеюсь, это поможет!

Смежные вопросы