我们的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
(仅是创建列表,但仍不列出树)。
谢谢您的意见!
答案 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 issue,example above just as project test case,在与问题链接的提交中可以找到另一个示例。
(注意:升级到2.0.2 didn't work for me是因为还需要升级Spring,这是当前不可能的。)
原始问题的答案是否,因为Spring Restdocs仍然保留字段描述符的列表格式。但是,在此修复程序之后,似乎并不太困扰我。