Java API десериализация JSON: как узнать какое поле Объекта пришло?

233
22 мая 2018, 12:40

Пишу АПИ тест, описал класс ошибок

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Message {
    private String email;
    private String password;
}

в респонсе приходит только одно поле в зависимости от моделируемой ситуации. Соответственно при ассерте нужно понимать какое поле вытягивать. Если писать под каждую ситуацию тест это долго т.к. поля будут пополнятся. я данные на вход я подаю из файла. Например подаю ему на вход логин, неправильный пароль, и мессаг который должен быть в такой ситуации.

{
    "success": false,
    "error": {
        "message": {
            "email": "Значение «Электронная почта» не является правильным email адресом."
        }
    }
}

И сравниваю

assertTrue(actualAnswer.getError().getMessage().getEmail().equals(errMessage));

но при следующей комбинации данных уже прийдет емейл и пример меседжа на неправильный емейл соответственно и асерт нужен другой.

{
    "success": false,
    "error": {
        "message": {
            "password": "Пароль слишком слабый или содержит недопустимые символы! Разрешено использовать цифры верхний и нижний регистр букв латинского алфавита."
        }
    }
}

Пробовал if но все-равно java.lang.NullPointerException т.к. ищет имейл. Подскажите как написать универсальный ассерт.

Answer 1

Вы можете добавить в свой проект groovy класс со следующем методом

@SuppressWarnings("GrUnresolvedAccess")
static Map getChildMessage() {
    def object = new JsonSlurper().parseText(sGetJson())
    return object.error.message as Map
}

где sGetJson() - функция возвращающая ваш json (String)

Для добавления groovy класса, если у вас maven проект, добавьте в pom.xml в dependencies:

        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.4.15</version>
        </dependency>

Соответственно получить тип сообщения с ошибкой можно так:

getChildMessage().keySet()[0]

а получить текст сообщения ошибки можно так:

getChildMessage().values().getAt(0)

Надеюсь вам это поможет.

READ ALSO
Найти сумму всех четных и сумму нечетных элементов массива

Найти сумму всех четных и сумму нечетных элементов массива

Начал изучать javaПолучил такое задание "Найти сумму всех четных и сумму нечетных элементов массива"

264
java график популярности [закрыт]

java график популярности [закрыт]

привет всем у меня такая проблема, пишу свой первый проект на java (Spring Boot), а именно пишу магазин одежды и мне надо чтобы в графике показывало...

214
Java Map stream

Java Map stream

Есть Map <String, <Person>> persons;

216
Как получить XML строку из Document?

Как получить XML строку из Document?

Как получить XML-строку, если она сгенерирована в Document? Требуется именно String, а не вывод в файл

236