【问题标题】:Utilize Spring Restdocs DSL for validation利用 Spring Restdocs DSL 进行验证
【发布时间】:2018-07-27 23:33:36
【问题描述】:

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

我将 Spring Restdocs 移动到 compile Maven 范围,并将 sn-p 创建移动到生产代码,在 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(仅用于创建列表的快捷方式但仍然列出不树)。

感谢您的意见!

【问题讨论】:

    标签: java json validation spring-restdocs


    【解决方案1】:

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

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

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

    更多信息:original issueexample above just as project test case,其他示例可以在问题链接的提交中找到。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      • 1970-01-01
      • 2019-08-24
      • 2012-11-27
      • 2013-12-08
      相关资源
      最近更新 更多