mty*_*urt 5 java unit-testing jsonpath
假设我有以下 DTO:
class C {
String a;
String b;
}
Run Code Online (Sandbox Code Playgroud)
我有 JSON:
{
"c" : {
"a" : "aaa",
"b" : "bbb"
}
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是,完成以下测试:
C expected = new C("aaa","bbb");
mockMvc.perform(get("url"))
.andExpect(jsonPath("$.c", is(expected)));
Run Code Online (Sandbox Code Playgroud)
它失败。如果我首先序列化为expectedJSON 然后尝试匹配,它会再次失败,因为它是一个字符串。这可能吗?
永远记住:不存在“JSON 对象”这样的东西。JSON 是对象的序列化格式。JSON 始终是一个字符串。您可以从对象转换为 JSON 并返回(因此也可以从对象转换为字符串并返回)。但
{ "a": "b" }
Run Code Online (Sandbox Code Playgroud)
是一个 JavaScript 对象,而不是 JSON(即使它看起来非常相似)。
这实际上是您问题的答案:当您序列化时expected,您会得到 JSON(传输格式,即字符串)。检查的不是这个jsonPath()。jsonPath()针对 JavaScript 类型进行验证。
这篇博文建议您需要单独检查每个字段:
.andExpect(jsonPath("$.c.a", is(expected.a)))
.andExpect(jsonPath("$.c.b", is(expected.b)));
Run Code Online (Sandbox Code Playgroud)
这很乏味。你需要的是
a) 配置 JSON 框架以使用对键进行排序的映射系统
b) 您需要弄清楚jsonPath("$.c", ...)返回的类型 - 它可能是您的 JSON 框架用来表示通用 JavaScript 对象的类型。
支票看起来像这样:
C c = new C("aaa","bbb");
String serialized = JSON.serialize(c); // to string
JSObject expected = JSON.parse(serialized); // to generic JavaScript object
mockMvc.perform(get("url"))
.andExpect(jsonPath("$.c", is(expected)));
Run Code Online (Sandbox Code Playgroud)
请注意,只有在JSObject正确实现equals().
| 归档时间: |
|
| 查看次数: |
2684 次 |
| 最近记录: |