在JUnit Test中的MockHttpServletRequest中设置@ModelAttribute

时间:2011-06-14 06:18:50

标签: spring spring-mvc junit annotations

我正在尝试测试一个弹簧mvc控制器。其中一种方法将表单输入作为POST方法。 此方法通过@ModelAttribute注释获取表单的commandObject。 如何使用Spring的Junit测试设置此测试用例?

控制器的方法如下所示:

@RequestMapping(method = RequestMethod.POST)
public String formSubmitted(@ModelAttribute("vote") Vote vote, ModelMap model) { ... }

{。{1}}对象在.jsp:

中定义
Vote

现在我想在Test中测试这个表单POST,其设置如下:

 <form:form method="POST" commandName="vote" name="newvotingform">

测试表单POST的实际方法:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/spring/applicationContext.xml"})
@TestExecutionListeners({WebTestExecutionerListener.class, DependencyInjectionTestExecutionListener.class})
public class FlowTest { ... }

目前已注释掉的3行是做这项工作的微弱尝试 - 但它没有奏效。 任何人都可以提供一些提示吗?

我真的不想直接在我的测试中调用控制器方法,因为我觉得这不会在网络环境中真正测试控制器。

2 个答案:

答案 0 :(得分:7)

您必须模拟HTML表单的功能。它将简单地传递字符串请求参数。尝试:

req.setParameter("name","Test");
req.setParameter("duration","45");

答案 1 :(得分:7)

使用Spring MVC 3,您可以使用以下内容:

        mockMvc.perform(post("/secretSauce")
            .param("password", "123")
            .sessionAttr("sessionData", "tomato"))
            .andDo(print())
            .andExpect(status().isOk());