如何使用Spring MVC测试测试表单提交?

时间:2016-11-26 16:56:38

标签: spring spring-mvc groovy thymeleaf spring-test-mvc

我使用Spring创建控制器的大多数经验都是针对使用JSON格式请求的REST控制器。我一直在搜索有关如何对表单提交进行测试的文档,到目前为止,这是我理解它应该使用MockMvc的方式:

MvcResult result = mockMvc.perform(post("/submit")
                .param('title', 'test title')
                .param('description', 'test description'))
                .andReturn()

但是,我不确定如何将表单参数映射到模型对象。我在搜索中弹出了@ModelAttribute注释,但我无法弄清楚它应该如何用于映射。此外,官方文档中的this quick start guide没有详细说明th:objectth:field等内容如何转换为HTML以及随后转换为URL编码形式。

我的控制器代码类似于以下内容:

@PostMapping('/submit')
def submit(@ModelAttribute WriteUp writeUp) {
    //do something with writeUp object
    'result'
}

2 个答案:

答案 0 :(得分:2)

我通过反复试验发现我的具体问题可能是特定于Groovy的。事实证明,测试代码和控制器代码没有问题。重申一下,要测试表单提交,请使用param方法perform方法MockMvcRequestBuilders。另一件需要注意的事情是,如果未指定内容类型,这似乎不起作用。这是一个适合我的示例测试代码:

MvcResult result = webApp.perform(post("/submit")
        .contentType(APPLICATION_FORM_URLENCODED) //from MediaType
        .param('title', 'test title')
        .param('description', 'test description'))
        .andReturn()

正如您所看到的,它与我最初发布的内容没什么不同。控制器代码几乎相同,@ModelAttribute工作正常。

我的设置问题是,因为我使用Groovy,我认为在我的WriteUp中自动生成了getter和setter。以下是WriteUp类最初的显示方式:

class WriteUp {
    private String title
    private String description
}

我还没有在Groovy中编写代码一段时间,而上次我做的时候,上面的类可以假设隐含了getter和setter。但事实证明并非如此。 要解决我的具体问题,我将字段中的访问修饰符更新为default(包级别)

class WriteUp {
    String title
    String description
}

答案 1 :(得分:0)

  

我看到@ModelAttribute注释会在我的搜索中弹出,但是我   无法弄清楚它应该如何用于制图。

当您使用writeUp标记@ModelAttribute对象时,Spring容器会从{{1}填充参数(例如titledescription等)。 }对象&当请求从客户端到服务器时(可以是浏览器或HttpServletRequest单元测试客户端或其他任何东西),将对象注入到控制器方法中。

此外,很少有其他基本要点可供您快速了解:

(1)MockMvc方法映射到URI和Controller(如POST / GET / DELETE / PUT等...),如下所示:

RequestMethod

(2) @RequestMapping(value="/submit", method=RequestMethod.POST) public String submit(@ModelAttribute WriteUp writeUp) { //Call the service and Save the details model.addAttribute("Writeup details added successfully"); return "writeUpResult"; //Returns to the View (JSP) } 将映射到http POST / PUT请求的对象(如@ModelAttribute),其中html表格数据是http正文的一部分。

(3)writeUp@RequestParam将用于http GET请求,其中参数是URL的一部分(即,不是http正文的一部分)。

您可以查看here以了解DispatcherServlet请求处理& Spring MVC基本Web流程。