MockMvcResultMatchers - jsonPath() 与 content()

MockMvcResultMatchers - jsonPath() vs content()

我正在使用 org.springframework.test.web.servlet.MockMvc 对象测试 Spring REST 控制器。 我可以使用接受 Hamcrest 匹配器的 MockMvcResultMatchers.content() 方法或 MockMvcResultMatchers.jsonPath() 方法验证响应 JSON。我想知道哪种方法更好,最佳做法是什么?由于结构复杂,Hamcrest 匹配器似乎真的很难阅读,并且对于 content(),长 JSON 必须外部化到单独的文件(但这没什么大不了恕我直言)。我应该更喜欢一个选项还是完全个人的事情?

这取决于您正在操纵的负载。

如果负载很短 String,没有移动值(如日期等),您可以使用明文比较,可能使用 hjson 编写以提高可读性。

另一方面,如果您必须测试复杂的有效负载,json路径是简化测试阅读的好方法。

在许多情况下,断言负载符合您的 json-schema 就足够了,因为您的业务规则是在您的域包中测试的,所以您只需要测试从业务对象到DTO.

在极少数情况下,您的大部分测试都是关于测试 JSON 内容的,您可能需要使用专门的比较工具,例如 JsonUnit并将负载模板存储在文件中。

好吧,如果您正在进行单元测试(如在每个方法案例中的测试),那么您唯一使用 MockMvcResultMatchers#... 进行测试的是您的代码与 spring-mvc 约定的集成。

当您的回答不是 JSON 时,您可以使用 content()。 IE。如果响应是纯文本。

jsonPath() 让您有更多机会检查回复。 例如

  • 您只需要检查一个特定的字段;

  • 你需要检查json-数组,但你不关心顺序;

  • 你比较greater/less,但不是完全匹配,