Как проверить, нет ли свойства в Spring Boot JacksonTester? - PullRequest
1 голос
/ 09 июля 2019

Как использовать @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");
    }
}

Существует ли метод для добавления ???, чтобы он проверял, что свойство не в результирующем JSON, когда оно null?

В качестве обходного пути я сейчас использую:

    assertThat(content).doesNotHave(new Condition<>(
            charSequence -> charSequence.toString().contains("myProperty"),
            "The property 'myProperty' should not be present"));

Но, конечно, это не совсем то же самое.

1 Ответ

1 голос
/ 12 июля 2019

Вы можете использовать утверждения пути 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");
...