利用Spring Restdocs DSL进行验证

时间:2018-07-27 23:33:37

标签: 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"))。 (我认为,不管我的案件有多虐待,它都是有用的。)

我浏览并细化了文档中的示例,这些文档看似很有希望,但AFAIK实际上并未涵盖这种情况,即:subsectionWithPath(跳过子树),underPath(仅关注子树)或ResponseFieldsSnippet.andWithPrefix(仅是创建列表,但仍不列出树)。

谢谢您的意见!

1 个答案:

答案 0 :(得分: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仍然保留字段描述符的列表格式。但是,在此修复程序之后,似乎并不太困扰我。