首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Spring测试测试表单提交?

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

Stack Overflow用户
提问于 2016-11-26 16:56:38
回答 2查看 4.7K关注 0票数 2

我使用Spring创建控制器的大部分经验是用于使用JSON格式请求的REST控制器。我一直在寻找关于如何为表单提交进行测试的文档,到目前为止,我理解它应该使用MockMvc

代码语言:javascript
复制
MvcResult result = mockMvc.perform(post("/submit")
                .param('title', 'test title')
                .param('description', 'test description'))
                .andReturn()

但是,我不知道如何将表单参数映射到模型对象。我在我的搜索中看到@ModelAttribute注释弹出,但我不知道它应该如何用于映射。此外,官方文档中的这个快速启动指南没有详细说明像th:objectth:field这样的东西是如何转换成th:objectth:field编码的形式的。

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

代码语言:javascript
复制
@PostMapping('/submit')
def submit(@ModelAttribute WriteUp writeUp) {
    //do something with writeUp object
    'result'
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-27 08:50:30

通过反复试验,我发现我的具体问题可能是特定于Groovy的。那里的测试代码和控制器代码,原来,没有问题。为了再次测试表单提交,请通过paramperform方法使用MockMvcRequestBuilders方法。另一件需要注意的事情是,如果没有指定内容类型,这似乎不起作用。下面是一个适合我的示例测试代码:

代码语言:javascript
复制
MvcResult result = webApp.perform(post("/submit")
        .contentType(APPLICATION_FORM_URLENCODED) //from MediaType
        .param('title', 'test title')
        .param('description', 'test description'))
        .andReturn()

正如你所看到的,它和我最初发布的没有太大的不同。控制器代码几乎是一样的,@ModelAttribute工作得很好。

但是,我的设置的问题是,由于我使用了Groovy,所以我假设getter和setter是在我的WriteUp 中自动生成的。下面是WriteUp类最初的样子:

代码语言:javascript
复制
class WriteUp {
    private String title
    private String description
}

我已经有一段时间没有用Groovy编写代码了,上次我这样做的时候,可以假定上面的类有getters和setters。然而,事实证明并非如此。为了解决我的具体问题,我将字段中的访问修饰符更新为default (包级别)。

代码语言:javascript
复制
class WriteUp {
    String title
    String description
}
票数 5
EN

Stack Overflow用户

发布于 2016-11-26 17:23:03

我已经在我的搜索中看到@ModelAttribute注释弹出,但我不知道它应该如何用于映射。

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

另外,对于你的快速理解,几乎没有其他的基本要点:

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

代码语言:javascript
复制
    @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)
     }

(2) @ModelAttribute将映射到http /PUT请求的对象(如您的writeUp),其中html数据是http的一部分。

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

您可以通过这里了解DispatcherServlet请求处理& Spring基本web流。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40820745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档