Spring Test MVC:如何将对象用作请求参数

时间:2016-01-07 07:31:48

标签: java spring spring-mvc

我正在尝试编写Spring MVC测试来测试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)方法将String / primitive值设置到GatewayForm对象上。

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

有人可以提供建议吗?

1 个答案:

答案 0 :(得分:0)

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

查看spring-mvc-test-utils library有多种策略可以将对象转换为String。但是,在源代码中将对象转换为String的默认策略是使用:

var validator = _context.Resolve(typeof(IValidator<>)
                        .MakeGenericType(new[] { query.GetType() }));
var handler = _context.Resolve(typeof(IQueryHandler<>)
                      .MakeGenericType(new[] { query.GetType() }));

例如我的用例是将List作为参数传递给我的集成测试。我的控制器接受一个具有属性的对象:

String.valueOf(Object object)

因此,我的集成测试会发布如下参数:

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

我确信这可能不适合更复杂的课程。然而,对于这个微不足道的案例它是有效的。

希望它有所帮助!