【发布时间】:2016-08-02 18:50:50
【问题描述】:
我正在编写测试以验证我是否可以向我们的 API 发布通用表单。
我还添加了一些调试,但我注意到实际表单发布的数据; (Postman / AngularJS 或 w/e)不同于进行 mockMVC 测试,例如:
MvcResult response = mockMvc
.perform(post("/some/super/secret/url") //
.param("someparam1", "somevalue") //
.param("someparam2", "somevalue") //
.contentType(MediaType.APPLICATION_FORM_URLENCODED) //
.accept(MediaType.APPLICATION_JSON)) //
.andExpect(status().isOk()) //
.andReturn();
配置与生产中运行的配置完全相同,等等。但是,当我的拦截器记录内容时,在实际测试(不是 mockMVC)中,内容的格式类似于“someparam1=somevalue&etc=encore”
当我打印 mockMVC 内容时,我实际上似乎没有内容,但请求中有 Params,我假设它们像 GET 参数一样添加。
有人知道如何正确测试吗?我遇到了这个问题,因为看起来我们的表单帖子似乎没有被 Spring 解析,即使我们已将 FormHttpMessageConverter 添加到 servlet 上下文中。
【问题讨论】:
-
您能否提供更多详细信息,例如配置、您发布到服务器的真实数据以及一些日志详细信息以使其更清晰?关于模拟,看来您做得对,模拟测试的参数与您显示的发布数据格式相同。另外,请检查您是否有类似弹簧安全的想法。在执行后续步骤之前,您可能需要模拟 spring 安全性或执行登录。
-
我们不使用类似的东西,我发现我的例子实际上是错误的。在这种情况下 someParam1 和 someParam2 将是一个查询参数,(在 url 中)。我想使用表单参数因此 URLENCODED。然而,这似乎只能通过模型或值图来访问。所以我们需要一个解决方法(这被迁移为完全 spring mvc,以前是 @FormParam 而不是 spring)。
-
哦,还有发布的数据,就像我在 Mvc 部分下方的示例中一样,它发布了一个与 & 和 = 连接的内容字符串
-
由于缺乏细节,我不知道您如何处理控制器中的发布数据。但是根据申请表的 url 编码,您发布的参数是正确的格式。这里的参数并不意味着只能在url中,它也可以在post内容中,格式相同
&name=value -
在 Spring Boot 2.2.6 上,同样的设置对我来说效果很好。所以,我认为他们在此期间已经解决了这个问题。