gpt4 book ai didi

java - 集成测试将整个对象发布到 Spring MVC Controller

转载 作者:IT老高 更新时间:2023-10-28 13:02:28 25 4
gpt4 key购买 nike

在集成测试 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 :

@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

但我不喜欢必须记住在我需要的每个 Controller 的末尾调用完成的想法。毕竟表单数据不必在 session 中,我只需要一个请求。

所以我现在唯一能想到的就是编写一些 Util 类,它使用 MockHttpServletRequestBuilder 将所有对象字段附加为 .param 使用反射或单独为每个测试用例..

我不知道,感觉不直观..

关于如何让我的点赞更轻松有什么想法/想法? (除了直接调用 Controller )

谢谢!

最佳答案

我有同样的问题,结果发现解决方案相当简单,使用 JSON 编码器。
让您的 Controller 通过将 @ModelAttribute("newObject") 更改为 @RequestBody 来更改签名。像这样:

@Controller
@RequestMapping(value = "/somewhere/new")
public class SomewhereController {

@RequestMapping(method = RequestMethod.POST)
public String post(@RequestBody NewObject newObject) {
// ...
}
}

那么在你的测试中你可以简单地说:

NewObject newObjectInstance = new NewObject();
// setting fields for the NewObject

mockMvc.perform(MockMvcRequestBuilders.post(uri)
.content(asJsonString(newObjectInstance))
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON));

asJsonString 方法只是:

public static String asJsonString(final Object obj) {
try {
final ObjectMapper mapper = new ObjectMapper();
final String jsonContent = mapper.writeValueAsString(obj);
return jsonContent;
} catch (Exception e) {
throw new RuntimeException(e);
}
}

关于java - 集成测试将整个对象发布到 Spring MVC Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17143116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com