我使用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:object
和th:field
等内容如何转换为HTML以及随后转换为URL编码形式。
我的控制器代码类似于以下内容:
@PostMapping('/submit')
def submit(@ModelAttribute WriteUp writeUp) {
//do something with writeUp object
'result'
}
答案 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}填充参数(例如title
,description
等)。 }对象&当请求从客户端到服务器时(可以是浏览器或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流程。