将@JsonTest
与@Autowired
JacksonTester
一起使用时,如何测试某个属性是否不存在?
假设您有要序列化的对象:
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MyTestObject {
private Boolean myProperty;
// getter and setter
}
通过此测试:
@RunWith(SpringRunner.class)
@JsonTest
public class MyTestObjectTest {
@Autowired
private JacksonTester<MyTestObject> tester;
public void testPropertyNotPresent() {
JsonContent content = tester.write(new MyTestObject());
assertThat(content).???("myProperty");
}
}
是否有一种方法可以放入???
中,以便当其为null
时,可以验证所得JSON中的属性为 not 吗?
作为一种解决方法,我目前使用:
assertThat(content).doesNotHave(new Condition<>(
charSequence -> charSequence.toString().contains("myProperty"),
"The property 'myProperty' should not be present"));
但这当然不完全相同。
答案 0 :(得分:1)
您可以使用JSON路径断言来检查值,但是,当前不能使用它来检查路径本身是否存在。例如,如果使用以下命令:
JsonContent<MyTestObject> content = this.tester.write(new MyTestObject());
assertThat(content).hasEmptyJsonPathValue("myProperty");
它将同时通过{"myProperty": null}
和{}
。
如果要测试是否存在某个属性但null
,则需要编写如下内容:
private Consumer<String> emptyButPresent(String path) {
return (json) -> {
try {
Object value = JsonPath.compile(path).read(json);
assertThat(value).as("value for " + path).isNull();
} catch(PathNotFoundException ex) {
throw new AssertionError("Expected " + path + " to be present", ex);
}
};
}
然后您可以执行以下操作:
assertThat(content.getJson()).satisfies(emptyButPresent("testProperty"));
顺便说一句,您的字符串断言也可以简化为:
assertThat(content.toString()).doesNotContain("myProperty");