Перейти к основному содержимому

Проверка с помощью Spring Assert

· 5 мин. чтения

Задача: Медиана двух отсортированных массивов

Даны два отсортированных массива размерами n и m. Найдите медиану слияния этих двух массивов.
Временная сложность решения должна быть O(log(m + n)) ...

ANDROMEDA

1. Обзор

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

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

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

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

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

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

Также обратите внимание, что, несмотря на схожее название, утверждения 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. правда()

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

4.2. государство()

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

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

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

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

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

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

5.1. ненулевой()

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

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

5.2. нулевой()

С другой стороны, мы можем проверить, является ли объект нулевым , используя метод 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 является подклассом Engine.

5.4. назначаемый ()

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

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

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

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

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

6.1. имеетдлину()

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

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

6.2. имееттекст()

Мы можем усилить условие и проверить, содержит ли строка хотя бы один непробельный символ, используя метод 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 определенную подстроку, используя метод 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() :

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

Обратите внимание, что эта проверка по-прежнему проходит, если массив пуст, если в нем нет нулевых элементов.

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

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

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