利用 Spring Restdocs DSL 进行验证

Utilize Spring Restdocs DSL for validation

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

我将 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"))。 (我认为无论我的情况如何,它都会有用。)

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

感谢您的意见!

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

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

此设置表示 kitten 字段本身是强制性的,但数组允许为空,因此在这种情况下不需要字段 nametype of name must then明确说明,因为图书馆无法从数据中获取线索)。

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

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

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