【发布时间】:2013-06-13 03:31:39
【问题描述】:
在集成测试 spring mvc web 应用程序时,有没有办法在模拟请求上传递整个表单对象?我能找到的只是将每个字段分别作为这样的参数传递:
mockMvc.perform(post("/somehwere/new").param("items[0].value","value"));
这适用于小型表单。但是,如果我发布的对象变大了怎么办?如果我可以发布整个对象,它也会使测试代码看起来更好。
具体来说,我想通过复选框测试多个项目的选择,然后发布它们。当然我可以只测试发布一个项目,但我想知道..
我们正在使用包含 spring-test-mvc 的 spring 3.2.2。
我的表单模型如下所示:
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: Integration Testing of Spring MVC Applications: Forms
但我不喜欢必须记住在我需要它的每个控制器的末尾调用完成的想法。毕竟表单数据不必在会话中,我只需要一个请求。
所以我现在唯一能想到的就是编写一些 Util 类,它使用 MockHttpServletRequestBuilder 将所有对象字段附加为 .param 使用反射或单独为每个测试用例..
我不知道,感觉不直观..
关于如何让我的点赞更轻松有什么想法/想法? (除了直接调用控制器)
谢谢!
【问题讨论】:
-
尝试使用 gson 并将对象转换为 json 并发布 ??
-
这有什么帮助?我的表单将发布
MediaType.APPLICATION_FORM_URLENCODED数据,因此我的测试应该发送该数据.. 我什至尝试从我发布的链接进行转换,将字节 [] 发送到控制器,但它仍然无法接收它..
标签: java spring testing spring-mvc integration-testing