模拟 MVC - 添加请求参数进行测试
Posted
技术标签:
【中文标题】模拟 MVC - 添加请求参数进行测试【英文标题】:Mock MVC - Add Request Parameter to test 【发布时间】:2013-08-01 02:23:11 【问题描述】:我正在使用 spring 3.2 mock mvc 来测试我的控制器。我的代码是
@Autowired
private Client client;
@RequestMapping(value = "/user", method = RequestMethod.GET)
public String initUserSearchForm(ModelMap modelMap)
User user = new User();
modelMap.addAttribute("User", user);
return "user";
@RequestMapping(value = "/byName", method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
public
@ResponseBody
String getUserByName(
@RequestParam("firstName") String firstName,
@RequestParam("lastName") String lastName,
@ModelAttribute("userClientObject") UserClient userClient)
return client.getUserByName(userClient, firstName, lastName);
我写了以下测试:
@Test public void testGetUserByName() throws Exception
String firstName = "Jack";
String lastName = "s";
this.userClientObject = client.createClient();
mockMvc.perform(get("/byName")
.sessionAttr("userClientObject", this.userClientObject)
.param("firstName", firstName)
.param("lastName", lastName)
).andExpect(status().isOk())
.andExpect(content().contentType("application/json"))
.andExpect(jsonPath("$[0].id").exists())
.andExpect(jsonPath("$[0].fn").value("Marge"));
我得到的是
java.lang.AssertionError: Status expected:<200> but was:<400>
at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:60)
at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:89)
at org.springframework.test.web.servlet.result.StatusResultMatchers$5.match(StatusResultMatchers.java:546)
at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:141)
为什么会这样?传递@RequestParam的方法是否正确
【问题讨论】:
【参考方案1】:当我分析您的代码时。我也遇到了同样的问题,但我的问题是,如果我为名字和姓氏都赋予价值意味着它工作正常。但是当我只给出一个值时,它表示 400。无论如何使用 .andDo(print()) 方法来找出错误
public void testGetUserByName() throws Exception
String firstName = "Jack";
String lastName = "s";
this.userClientObject = client.createClient();
mockMvc.perform(get("/byName")
.sessionAttr("userClientObject", this.userClientObject)
.param("firstName", firstName)
.param("lastName", lastName)
).andDo(print())
.andExpect(status().isOk())
.andExpect(content().contentType("application/json"))
.andExpect(jsonPath("$[0].id").exists())
.andExpect(jsonPath("$[0].fn").value("Marge"));
如果您的问题是org.springframework.web.bind.missingservletrequestparameterexception
,您必须将代码更改为
@RequestMapping(value = "/byName", method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
public
@ResponseBody
String getUserByName(
@RequestParam( value="firstName",required = false) String firstName,
@RequestParam(value="lastName",required = false) String lastName,
@ModelAttribute("userClientObject") UserClient userClient)
return client.getUserByName(userClient, firstName, lastName);
【讨论】:
我写了同样的代码,但是modelAttribute有问题。请阅读***.com/questions/19427341/… 注意一下,print()
是MockMvcResultHandlers
类的方法【参考方案2】:
如果有人来这个问题寻找同时添加多个参数的方法(我的情况),您可以将.params
与 MultivalueMap 一起使用,而不是添加每个 .param
:
LinkedMultiValueMap<String, String> requestParams = new LinkedMultiValueMap<>()
requestParams.add("id", "1");
requestParams.add("name", "john");
requestParams.add("age", "30");
mockMvc.perform(get("my/endpoint").params(requestParams)).andExpect(status().isOk())
【讨论】:
【参考方案3】:@ModelAttribute
是请求参数到特定对象类型的 Spring 映射。所以你的参数可能看起来像userClient.username
和userClient.firstName
等,因为 MockMvc 模仿来自浏览器的请求,你需要传入 Spring 将从表单中使用的参数来实际构建 UserClient
对象。
(我认为 ModelAttribute 是一种帮助器,可以从表单中的一堆字段中构造一个对象,但您可能需要阅读一些内容以获得更好的定义)
【讨论】:
我之前使用过 ModelAttribute 这不是问题。我对如何发送 @RequestParam 感到困惑以上是关于模拟 MVC - 添加请求参数进行测试的主要内容,如果未能解决你的问题,请参考以下文章