«1. Обзор

В этом руководстве мы сосредоточимся на назначении класса Spring Assert и опишем его назначение, а также продемонстрируем, как его использовать.

2. Назначение класса Assert

Класс Spring Assert помогает нам проверять аргументы. Используя методы класса Assert, мы можем писать предположения, которые, как мы ожидаем, будут истинными. И если они не выполняются, генерируется исключение времени выполнения.

Каждый метод Assert можно сравнить с оператором assert Java. Оператор утверждения Java выдает ошибку во время выполнения, если его условие не выполняется. Интересным фактом является то, что эти утверждения можно отключить.

Вот некоторые характеристики методов Spring Assert:

    Методы Assert являются статическими. Они генерируют либо IllegalArgumentException, либо IllegalStateException. Первый параметр обычно является аргументом для проверки или логическим условием для проверки. Последний параметр обычно это сообщение об исключении, которое отображается в случае сбоя проверки Сообщение может быть передано либо как параметр String, либо как параметр Supplier\u003cString\u003e

Также обратите внимание, что, несмотря на схожее имя, утверждения Spring не имеют ничего общего с утверждениями JUnit и других сред тестирования. Утверждения Spring предназначены не для тестирования, а для отладки.

3. Пример использования

Давайте определим класс Car с открытым методом drive():

public class Car {
    private String state = "stop";

    public void drive(int speed) {
        Assert.isTrue(speed > 0, "speed must be positive");
        this.state = "drive";
        // ...
    }
}

Мы видим, что скорость должна быть положительным числом. Приведенная выше строка представляет собой краткий способ проверить условие и выдать исключение, если условие не выполнено:

if (!(speed > 0)) {
    throw new IllegalArgumentException("speed must be positive");
}

Каждый публичный метод Assert содержит примерно такой код — условный блок с исключением во время выполнения, из которого восстановление приложения не ожидается.

Если мы попытаемся вызвать метод drive() с отрицательным аргументом, будет сгенерировано исключение IllegalArgumentException:

Exception in thread "main" java.lang.IllegalArgumentException: speed must be positive

4. Логические утверждения

4.1. isTrue()

Это утверждение обсуждалось выше. Он принимает логическое условие и генерирует исключение IllegalArgumentException, когда условие ложно.

4.2. state()

Метод state() имеет ту же сигнатуру, что и isTrue(), но генерирует исключение IllegalStateException.

Как следует из названия, его следует использовать, когда метод нельзя продолжать из-за недопустимого состояния объекта.

Представьте, что мы не можем вызвать метод fuel(), если машина работает. Давайте воспользуемся утверждением state() в этом случае:

public void fuel() {
    Assert.state(this.state.equals("stop"), "car must be stopped");
    // ...
}

Конечно, мы можем проверить все, используя логические утверждения. Но для лучшей читабельности мы можем использовать дополнительные утверждения, которые делают наш код более выразительным.

5. Утверждения объектов и типов

5.1. notNull()

Мы можем предположить, что объект не является нулевым, используя метод notNull():

public void сhangeOil(String oil) {
    Assert.notNull(oil, "oil mustn't be null");
    // ...
}

5.2. isNull()

С другой стороны, мы можем проверить, является ли объект нулевым, используя метод isNull():

public void replaceBattery(CarBattery carBattery) {
    Assert.isNull(
      carBattery.getCharge(), 
      "to replace battery the charge must be null");
    // ...
}

5.3. isInstanceOf()

Чтобы проверить, является ли объект экземпляром другого объекта определенного типа, мы можем использовать метод isInstanceOf():

public void сhangeEngine(Engine engine) {
    Assert.isInstanceOf(ToyotaEngine.class, engine);
    // ...
}

В нашем примере проверка проходит успешно, поскольку ToyotaEngine является подклассом Двигатель.

5.4. isAssignable()

Для проверки типов мы можем использовать Assert.isAssignable():

public void repairEngine(Engine engine) {
    Assert.isAssignable(Engine.class, ToyotaEngine.class);
    // ...
}

Два недавних утверждения представляют отношение «является».

6. Текстовые утверждения

Текстовые утверждения используются для проверки строковых аргументов.

6.1. hasLength()

Мы можем проверить, не является ли строка пустой, то есть содержит хотя бы один пробел, используя метод hasLength():

public void startWithHasLength(String key) {
    Assert.hasLength(key, "key must not be null and must not the empty");
    // ...
}

6.2. hasText()

Мы можем усилить условие и проверить, содержит ли строка хотя бы один непробельный символ, используя метод hasText():

public void startWithHasText(String key) {
    Assert.hasText(
      key, 
      "key must not be null and must contain at least one non-whitespace  character");
    // ...
}

6.3. doNotContain()

Мы можем определить, содержит ли аргумент String определенную подстроку, используя метод doNotContain():

public void startWithNotContain(String key) {
    Assert.doesNotContain(key, "123", "key mustn't contain 123");
    // ...
}

7. Утверждения коллекции и сопоставления

7.1. notEmpty() для коллекций

Как следует из названия, метод notEmpty() утверждает, что коллекция не является пустой, что означает, что она не является нулевой и содержит по крайней мере один элемент:

public void repair(Collection<String> repairParts) {
    Assert.notEmpty(
      repairParts, 
      "collection of repairParts mustn't be empty");
    // ...
}

7.2. notEmpty() для карт

«Тот же метод перегружен для карт, и мы можем проверить, не является ли карта пустой и содержит хотя бы одну запись:

public void repair(Map<String, String> repairParts) {
    Assert.notEmpty(
      repairParts, 
      "map of repairParts mustn't be empty");
    // ...
}

8. Утверждения массива

8.1. notEmpty() для массивов

Наконец, мы можем проверить, не является ли массив пустым и содержит хотя бы один элемент, используя метод notEmpty():

public void repair(String[] repairParts) {
    Assert.notEmpty(
      repairParts, 
      "array of repairParts mustn't be empty");
    // ...
}

8.2. noNullElements()

Мы можем проверить, что массив не содержит пустых элементов, используя метод noNullElements(): в нем нет нулевых элементов.

public void repairWithNoNull(String[] repairParts) {
    Assert.noNullElements(
      repairParts, 
      "array of repairParts mustn't contain null elements");
    // ...
}

9. Заключение

В этой статье мы исследовали класс Assert. Этот класс широко используется в среде Spring, но мы могли бы легко написать более надежный и выразительный код, используя его преимущества.

Как всегда, полный код для этой статьи можно найти в проекте GitHub.

«