java - 利用 Spring Restdocs DSL 进行验证
问题描述
我们的 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 进行验证是一个坏主意。在切换到重量级解决方案 á la JSON 模式之前,我想问一下:Restdocs 是否提供了某种方式来将字段描述符表示为树而不是规则列表?例如上面,类似fieldWithPath("kittens[]", subfieldWithPath("name"))
. (我认为无论我的情况如何滥用,它都会很有用。)
我浏览并详细说明了文档中的示例,这些示例似乎很有希望,但 AFAIK 实际上并未涵盖这种情况,即:subsectionWithPath(跳过子树)、underPath(仅关注子树)或ResponseFieldsSnippet.andWithPrefix
(仅用于创建列表的快捷方式,但仍列出不树) .
感谢您的意见!
解决方案
我终于发现问题在较新的库版本中得到了解决,即 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 仍然保留字段描述符的列表格式。但是,在此修复之后,它似乎并没有给我带来太多困扰。
推荐阅读
- javascript - Cordova:从 SD 卡中读取目录和文件
- c - 在这个 pthreading C 程序中避免死锁的一些提示
- ios - 如何修复 UIButton 的 sizeToFit/sizeThatFit 的宽度?
- google-api - Google Places API 不返回结果
- termux - 在 termux 中创建 metasploit 有效负载
- c++ - 从交换链获取多个屏幕缓冲区
- assembly - 程序集:使用“.equ”的无效操作数错误减去 2 个字符文字
- c# - 如何使用反射调用具有 0 个参数的非公共方法?
- c - 是否有解决此错误的方法:预期标识符或数字常量前的“(”?
- ruby - 冒泡排序算法中整数与 nil 的比较失败