Java SpringTestMVC:如何使用对象作为请求参数

Java SpringTestMVC:如何使用对象作为请求参数,java,spring,spring-mvc,Java,Spring,Spring Mvc,我正在尝试编写SpringMVC测试来测试Spring控制器。 当前,如果我想使用此签名测试控制器方法: @RequestMapping(value = "/new/save", method = RequestMethod.POST) @Transactional public String postGateway(@Valid GatewayForm gatewayForm, BindingResult bindingResult, RedirectAttributes flash, Mod

我正在尝试编写SpringMVC测试来测试Spring控制器。 当前,如果我想使用此签名测试控制器方法:

@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")
问题是,我只能使用.param(String,String)方法在GatewayForm对象上设置字符串/原语值

因此,上面的GatewayForm中有一些我无法设置的对象实例变量。我看到其他人发布了对象的JSON字符串,但这需要更改控制器方法的实现以使用“application/JSON”,我不想这样做


有人能提出建议吗?

由于问题的注释说明字符串本质上是HTTP请求参数的输入,因此目标是将表单对象转换为可接受的字符串

查看下表,可以使用多种策略将对象转换为字符串。但是,在源代码中将对象转换为字符串的默认策略是:

String.valueOf(Object object)
例如,我的用例是将一个列表作为参数传递到集成测试中。我的控制器接受具有以下属性的对象:

public class MyObjectThatTheControllerExpects {     
    List<SomeEnum> listOfEnums;
    Long id
    ...
我相信这可能不适合更复杂的类。然而,对于这个微不足道的例子,它是有效的


希望有帮助

由于问题的注释说明字符串本质上是HTTP请求参数的输入,因此目标是将表单对象转换为可接受的字符串

查看下表,可以使用多种策略将对象转换为字符串。但是,在源代码中将对象转换为字符串的默认策略是:

String.valueOf(Object object)
例如,我的用例是将一个列表作为参数传递到集成测试中。我的控制器接受具有以下属性的对象:

public class MyObjectThatTheControllerExpects {     
    List<SomeEnum> listOfEnums;
    Long id
    ...
我相信这可能不适合更复杂的类。然而,对于这个微不足道的例子,它是有效的


希望有帮助

在集成测试中,您不应该将对象传递给控制器。这是一个糟糕的做法。好吧,看来我必须尝试这个postForm()方法,而不是post()。让我尝试一下,MockMVC的目的是模拟一个请求,而不是直接测试方法
postGateway
。请求将只包含文本。客户机不发送
GatewayForm
对象,而是发送参数。这是100%合理的,但如果不映射到JSON,就没有真正的工具可以这样做。还是我遗漏了什么?我想我必须先检查一下现实生活中表单帖子的参数,然后再继续毫无理由地争论下去。在集成测试中,你不应该将对象传递给你的控制器。这是一个糟糕的做法。好吧,看来我必须尝试这个postForm()方法,而不是post()。让我尝试一下,MockMVC的目的是模拟一个请求,而不是直接测试方法
postGateway
。请求将只包含文本。客户机不发送
GatewayForm
对象,而是发送参数。这是100%合理的,但如果不映射到JSON,就没有真正的工具可以这样做。还是我遗漏了什么?我想在我继续毫无理由地争论之前,我必须检查一下现实生活中表单帖子的参数。。