Spring Boot: автоматически настроенные JSON тесты

Чтобы проверить, что сериализация и десериализация этого объекта JSON работает должным образом, вы можете использовать аннотацию @JsonTest. @JsonTest автоматически настраивает доступный поддерживаемый преобразователь JSON, который может быть одной из следующих библиотек:

  • Jackson ObjectMapper, любые @JsonComponent компоненты и любые Jackson модули
  • Gson
  • Jsonb

Если вам нужно настроить элементы автоконфигурации, вы можете использовать аннотацию @AutoConfigureJsonTesters.

Spring Boot включает помощников на основе AssertJ, которые работают с библиотеками JSONAssert и JsonPath, чтобы проверить, что JSON отображается должным образом. Классы JacksonTester, GsonTester, JsonbTester и BasicJsonTester могут использоваться для Jackson, Gson, Jsonb и Strings соответственно. Любые вспомогательные поля в тестовом классе могут быть @Autowired при использовании @JsonTest. В следующем примере показан тестовый класс для Jackson:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.*;
import org.springframework.boot.test.autoconfigure.json.*;
import org.springframework.boot.test.context.*;
import org.springframework.boot.test.json.*;

import static org.assertj.core.api.Assertions.*;

@JsonTest
class MyJsonTests {

    @Autowired
    private JacksonTester json;

    @Test
    void testSerialize() throws Exception {
        VehicleDetails details = new VehicleDetails("Honda", "Civic");
        // Утверждение против файла `.json` в том же пакете, что и тест
        assertThat(this.json.write(details)).isEqualToJson("expected.json");
        // Или использовать утверждения на основе пути JSON
        assertThat(this.json.write(details)).hasJsonPathStringValue("@.make");
        assertThat(this.json.write(details)).extractingJsonPathStringValue("@.make")
                .isEqualTo("Honda");
    }

    @Test
    void testDeserialize() throws Exception {
        String content = "{\"make\":\"Ford\",\"model\":\"Focus\"}";
        assertThat(this.json.parse(content))
                .isEqualTo(new VehicleDetails("Ford", "Focus"));
        assertThat(this.json.parseObject(content).getMake()).isEqualTo("Ford");
    }

}

Вспомогательные классы JSON также можно использовать непосредственно в стандартных модульных тестах. Для этого вызовите метод initFields помощника в вашем методе @Before, если вы не используете @JsonTest.

Если вы используете помощники Spring Boot на основе AssertJ для подтверждения числового значения по заданному пути JSON, вы не сможете использовать isEqualTo в зависимости от типа. Вместо этого вы можете использовать AssertJ satisfies, чтобы утверждать, что значение соответствует данному условию. Например, в следующем примере утверждается, что фактическое число является значением с плавающей запятой, близким к 0,15 со смещением 0,01.

assertThat(json.write(message))
    .extractingJsonPathNumberValue("@.test.numberValue")
    .satisfies((number) -> assertThat(number.floatValue()).isCloseTo(0.15f, within(0.01f)));


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки