【问题标题】:How to pass ModelAttrubute parameters using MockMvc?如何使用 MockMvc 传递 ModelAttrubute 参数?
【发布时间】:2013-10-26 03:47:49
【问题描述】:

我有这个 html 弹簧表单:

<form:form action="addVacancy" modelAttribute="myVacancy">
        <form:label path="name">name</form:label>
        <form:input path="name" ></form:input>
        <form:errors path="name" cssClass="error" />
        <br>
        <form:label path="description">description</form:label>
        <form:input path="description" id="nameInput"></form:input>
        <form:errors path="description" cssClass="error" />
        <br>
        <form:label path="date">date</form:label>
        <input type="date" name="date" />
        <form:errors path="date" cssClass="error" />
        <br>
        <input type="submit" value="add" />
    </form:form>

我用这个方法处理这个表格:

@RequestMapping("/addVacancy")
    public ModelAndView addVacancy(@ModelAttribute("myVacancy") @Valid Vacancy vacancy,BindingResult result, Model model,RedirectAttributes redirectAttributes){
        if(result.hasErrors()){
            model.addAttribute("message","validation error");
            return new ModelAndView("vacancyDetailsAdd");
        }
        vacancyService.add(vacancy);
        ModelAndView mv = new ModelAndView("redirect:goToVacancyDetails");
        mv.addObject("idVacancy", vacancy.getId());
        redirectAttributes.addAttribute("message", "added correctly at "+ new Date());
        return mv;
    }

如何进行同样的请求,提交表单后获取。这必须通过 MockMvc 来完成。

@Test
public void testMethod(){
    MockHttpServletRequestBuilder request = MockMvcRequestBuilders.get("/addVacancy");
    //what must I  write here?
    ResultActions result = mockMvc.perform(request);
}

我很困惑。

【问题讨论】:

  • 请不要创建帐户,以便您可以两次提问。

标签: java spring spring-mvc mocking spring-test


【解决方案1】:

当浏览器需要提交表单时,它通常会将表单&lt;input&gt; 字段序列化为url 编码的参数。因此,当您想模拟一个HttpServletRequest 时,您需要将这些相同的参数添加到请求中。

request.param("name", "some value")
       .param("description", "description value")
       .param("date", "some acceptable representation of date");

DispatcherServlet 将使用这些参数创建一个Vacancy 实例,以作为参数传递给您的处理程序方法。

【讨论】:

  • 假设你是对的。那我为什么要在表单中写
  • @gstackoverflow &lt;form:form&gt; 是一个 Spring 标签库。使用&lt;form&gt;,它将嵌套元素的path 属性绑定到指定的模型属性。 action 属性指定请求的目标 URL。我不明白你的问题来自哪里
  • 这样
    是冗余信息。没有这个字符串它可以工作。
  • @gstackoverflow 我不明白你想说什么。 html表单和mockmvc请求无关。
  • 是什么原因把 modelAttribute="myVacancy" 写成 html 格式?如果发送到服务器端的请求中不存在此值?
【解决方案2】:

您可以使用.flashAttr() 方法传入所需的@ModelAttribute 对象,如下所示:

request.flashAttr("myVacancy", new Vacancy()));

【讨论】:

    猜你喜欢
    • 2016-12-15
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多