首页 > 解决方案 > 利用 Spring Restdocs DSL 进行验证

问题描述

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

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

例如,假设 cat 的 JSON 被描述为fieldWithPath("kittens[]"), fieldWithPath("kittens[].name"),实际的 JSON{"kittens":[]}看起来是无效的,因为后者的描述符不满足。这不会发生在测试样本中,其中数据是为了最大限度地提高文档效益而捏造的,但对于真实案例来说却是个问题。

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

我浏览并详细说明了文档中的示例,这些示例似乎很有希望,但 AFAIK 实际上并未涵盖这种情况,即:subsectionWithPath(跳过子树)、underPath(仅关注子树)或ResponseFieldsSnippet.andWithPrefix(仅用于创建列表的快捷方式,但仍列出不树) .

感谢您的意见!

标签: javajsonvalidationspring-restdocs

解决方案


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

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

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

更多信息:原始问题上面的示例就像项目测试用例一样,其他示例可以在问题链接的提交中找到。

(注意:升级到 2.0.2对我不起作用,因为它还需要升级 Spring,这目前是不可能的。)

原始问题的答案是否定的,因为 Spring Restdocs 仍然保留字段描述符的列表格式。但是,在此修复之后,它似乎并没有给我带来太多困扰。


推荐阅读