java - 利用 Spring Restdocs DSL 进行验证

标签 java json validation spring-restdocs

我们的 REST API 通过使用 Spring Restdocs 以标准方式进行的一组测试进行记录(通过 mockMvc.perform(...)...andDo(document().fieldWithPath(...)) 声明。由于字段具有类型和强制/可选标志,因此我想在生产代码中重用此信息以进行响应正文验证。

我将 Spring Restdocs 移至 compile Maven 范围,并将代码片段创建移至生产代码,其中它对于 src/main 代码中的文档测试和响应主体拦截器都是可见的(后者仅调用 ResponseFieldsSnippet.createModel 方法)。一切正常,除了以下陷阱:空对象集合看起来无效,因为框架尝试将对象字段的 fieldWithPath 规则与不存在的数据进行匹配。

例如,假设 cat 的 JSON 被描述为 fieldWithPath("kittens[]"), fieldWithPath("kittens[].name"),则实际的 JSON {"kittens":[]} 显得无效,因为不满足后一个描述符。对于测试样本来说,这种情况不会发生,因为测试样本中的数据是为了最大化文档效益而编造的,但对于实际案例来说,这是个问题。

根据这一观察,我倾向于认为重复使用 Restdocs DSL 进行验证是一个坏主意。在切换到 JSON 模式的重量级解决方案之前,我想问:Restdocs 是否提供某种方法将字段描述符表示为树而不是规则列表?例如上面的例子,类似于 fieldWithPath("kittens[]", subfieldWithPath("name"))。 (我认为无论我的情况如何滥用,它都可能有用。)

我浏览并详细阐述了文档中的示例,这些示例看起来很有希望,但据我所知实际上并未涵盖这种情况,即:subsectionWithPath(跳过子树)、underPath(仅关注子树)或ResponseFieldsSnippet.andWithPrefix (只是创建列表的快捷方式,但仍然是列表而不是树)。

感谢您的意见!

最佳答案

我终于发现问题在较新的库版本中得到了解决,即1.2.5和2.0.2(我有1.2.2)。上面的例子必须表示为

fieldWithPath("kittens"),
fieldWithPath("kittens[]").optional(),
fieldWithPath("kittens[].name").type(STRING)

此设置显示 kitten字段本身是强制性的,但数组允许为空,因此没有字段 name在这种情况下是预期的(必须明确说明名称的 type,因为库无法从数据中获取线索)。

更多信息:original issue , example above just as project test case ,可以在从问题链接的提交中找到另一个示例。

(注意:升级到 2.0.2 didn't work for me 因为它还需要升级 Spring,但目前还不可能。)

原始问题的答案是,因为Spring Restdocs仍然保留字段描述符的列表格式。然而,在这次修复之后,它似乎并没有太困扰我。

关于java - 利用 Spring Restdocs DSL 进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51566723/

相关文章:

ruby-on-rails-3 - 接受导轨使用条款

javascript - 如何使用外部javascript验证表单值

java - 如果未选中复选框,如何禁用提交按钮?

java - 两个服务器实例上的 Hibernate 主键冲突

javascript - 如果对象属性存在于 Javascript/Typescript 中的另一个对象上,如何删除对象属性

javascript - 如何使用json PHP JQUERY Ajax从数据库读取数据?

java - 在某个 <span> 之间查找重复的 <br>

java - File.getCanonicalPath() 失败示例

java - 使用 Jackson 将 GeoJSON 映射到 Java

javascript - parsley js 验证 - 优先考虑验证约束和自定义错误消息