1. Обзор
В этом уроке мы сосредоточимся и опишем назначение класса Spring Assert и продемонстрируем, как его использовать.
2. Назначение класса Assert
Класс Spring Assert помогает нам проверять аргументы. Используя методы класса Assert , мы можем написать предположения, которые, как мы ожидаем, будут истинными. И если они не выполняются, возникает исключение во время выполнения.
Каждый метод Assert можно сравнить с инструкцией Java assert . Оператор Java assert выдает Ошибку во время выполнения, если его условие не выполняется. Интересный факт заключается в том, что эти утверждения могут быть отключены.
Вот некоторые характеристики методов Spring Assert :
- Методы Assert являются статическими
- Они бросают либо IllegalArgumentException или IllegalStateException
- Первый параметр обычно является аргументом для проверки или логическим условием для проверки
- Последний параметр обычно представляет собой сообщение об исключении, которое отображается в случае сбоя проверки
- Сообщение может быть передано либо как параметр String , либо как параметр Supplier
Также обратите внимание, что, несмотря на схожее название, утверждения 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. исТруэ()
Это утверждение обсуждалось выше. Он принимает условие boolean и выдает исключение IllegalArgumentException , когда условие ложно.
4.2. государство()
То государство() метод имеет ту же сигнатуру, что и исТруэ() но бросает Исключение IllegalStateException.
Как следует из названия, его следует использовать, когда метод не должен быть продолжен из-за незаконного состояния объекта.
Представьте, что мы не можем вызвать метод fuel () , если автомобиль работает. В этом случае давайте использовать утверждение state() :
public void fuel() { Assert.state(this.state.equals("stop"), "car must be stopped"); // ... }
Конечно, мы можем проверить все, используя логические утверждения. Но для лучшей читабельности мы можем использовать дополнительные утверждения, которые делают наш код более выразительным.
5. Утверждения объектов и типов
5.1. NotNull()
Мы можем предположить, что объект не является null с помощью метода NotNull() :
public void сhangeOil(String oil) { Assert.notNull(oil, "oil mustn't be null"); // ... }
5.2. isNull()
С другой стороны, мы можем проверить, является ли объект null , используя метод 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); // ... }
В нашем примере проверка проходит успешно, так как Toyota Engine является подклассом Engine.
5.4. isAssignable()
Для проверки типов мы можем использовать Assert.isAssignable() :
public void repairEngine(Engine engine) { Assert.isAssignable(Engine.class, ToyotaEngine.class); // ... }
Два недавних утверждения представляют собой отношения is-a .
6. Текстовые Утверждения
Текстовые утверждения используются для проверки аргументов String .
6.1. Длина()
Мы можем проверить, не является ли строка пустой, то есть содержит по крайней мере один пробел, с помощью метода 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. Не содержит()
Мы можем определить, не содержит ли аргумент String определенной подстроки, используя метод doesNotContain() :
public void startWithNotContain(String key) { Assert.doesNotContain(key, "123", "key mustn't contain 123"); // ... }
7. Сбор и сопоставление утверждений
7.1. непустой() для коллекций
Как следует из названия, метод NotEmpty() утверждает, что коллекция не является пустой, что означает, что она не является null и содержит по крайней мере один элемент:
public void repair(CollectionrepairParts) { Assert.notEmpty( repairParts, "collection of repairParts mustn't be empty"); // ... }
7.2. непустой() для карт
Тот же метод перегружен для карт, и мы можем проверить, не пуста ли карта и содержит ли она хотя бы одну запись:
public void repair(MaprepairParts) { 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. Неэлементы()
Мы можем проверить, что массив не содержит null элементов, используя метод noNullElements() :
public void repairWithNoNull(String[] repairParts) { Assert.noNullElements( repairParts, "array of repairParts mustn't contain null elements"); // ... }
Обратите внимание, что эта проверка по-прежнему проходит, если массив пуст, если в нем нет элементов null .
9. Заключение
В этой статье мы исследовали класс Assert . Этот класс широко используется в рамках Spring framework, но мы могли бы легко написать более надежный и выразительный код, используя его преимущества.
Как всегда, полный код этой статьи можно найти в проекте GitHub .