集成测试将整个对象发布到Spring MVC控制器
问题内容:
在对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这样的: Spring
MVC应用程序的集成测试:表单
但是我不喜欢必须记住在需要此功能的每个控制器的末尾调用complete的想法。在所有表单数据都不必在会话中之后,我只需要一个请求。
因此,我现在唯一想到的就是编写一个使用MockHttpServletRequestBuilder的Util类,以使用反射将每个对象字段附加为.param或针对每个测试用例单独添加。
我不知道,感觉不直观。
关于如何使自己的生活更轻松的任何想法/想法?(除了直接调用控制器外)
谢谢!
问题答案:
集成测试的主要目的之一MockMvc
是验证模型对象是否正确填充了表单数据。
为此,您必须传递从实际表单传递过来的表单数据(使用.param()
)。如果您使用NewObject
从数据到数据的自动转换,您的测试将不会涵盖特定类别的可能的问题(NewObject
与实际格式不兼容的修改)。