2013-10-17 38 views
1

我有這個網站春天形式:如何使用MockMvc傳遞ModelAttrubute參數?

<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); 
} 

我很困惑。

+0

請不要創建帳戶,這樣你可以問你的問題的兩倍。 –

回答

5

當瀏覽器需要提交表單時,它通常會將表單<input>作爲url編碼參數進行串行化。因此,當您想要模擬HttpServletRequest時,您需要將相同的參數添加到請求中。

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

DispatcherServlet將使用這些參數來創建一個Vacancy實例作爲參數傳遞到您的處理方法。

+0

假設你是對的。那麼爲什麼我在表單中寫入* *? – gstackoverflow

+0

@gstackoverflow''是一個Spring標籤庫。通過'

',它將嵌套元素的'path'屬性綁定到指定的模型屬性。 「action」屬性指定了請求的目標URL。我不明白你的問題來自哪裏 –

+0

通過這種方式** **它是多餘的信息。沒有這個字符串,它可以工作。 – gstackoverflow

0

您可以在需要@ModelAttribute對象傳遞與.flashAttr()方法,像這樣:

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