如何测试Spring Boot JacksonTester是否不存在属性?

时间:2019-07-09 08:39:45

标签: spring-boot spring-boot-test assertj

@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"));

但这当然不完全相同。

1 个答案:

答案 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");