Весняні заяви про затвердження

1. Огляд

У цьому посібнику ми зосередимось на описі мети класу Spring Assert та продемонструємо, як ним користуватися.

2. Призначення класу Assert

Клас Spring Assert допомагає нам перевірити аргументи. Використовуючи методи класу Assert , ми можемо писати припущення, які, як ми очікуємо, відповідають дійсності. І якщо вони не виконуються, виникає виняток часу виконання.

Кожен Затверджуй «s метод можна порівняти з Java Assert заяву. Інструкція Java assert видає помилку під час виконання, якщо її стан не вдається. Цікавий факт, що ці твердження можна відключити.

Ось декілька характеристик методів Spring Assert :

  • Методи Assert статичні
  • Вони кидають або IllegalArgumentException, або IllegalStateException
  • Перший параметр, як правило, є аргументом для перевірки або логічною умовою для перевірки
  • Останній параметр, як правило, є повідомленням про виняток, яке відображається, якщо перевірка не вдається
  • Повідомлення може передаватися як параметр String або як параметр постачальника

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

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.

Як випливає з назви, його слід використовувати, коли метод не можна продовжувати через незаконний стан об’єкта.

Уявіть, що ми не можемо викликати метод палива (), якщо машина працює. Давайте використаємо твердження state () у цьому випадку:

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

Звичайно, ми можемо перевірити все, використовуючи логічні твердження. Але для кращої читабельності ми можемо використовувати додаткові твердження, які роблять наш код більш виразним.

5. Об'єкт і тип Assertio нс

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 є підкласом Engine.

5.4. isAssignable ()

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

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

Два останні твердження представляють відносини " це-це" .

6. Текстові твердження

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

6.1. hasLength ()

We can check if a String isn't blank, meaning it contains at least one whitespace, by using the hasLength() method:

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

6.2. hasText()

We can strengthen the condition and check if a String contains at least one non-whitespace character, by using the hasText() method:

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

6.3. doesNotContain()

We can determine if a String argument doesn’t contain a specific substring by using the doesNotContain() method:

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

7. Collection and Map Assertions

7.1. notEmpty() for Collections

As the name says, the notEmpty() method asserts that a collection is not empty meaning that it’s not null and contains at least one element:

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

7.2. notEmpty() for Maps

The same method is overloaded for maps, and we can check if a map is not empty and contains at least one entry:

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

8. Array Assertions

8.1. notEmpty() for Arrays

Finally, we can check if an array is not empty and contains at least one element by using the notEmpty() method:

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

8.2. noNullElements()

We can verify that an array doesn’t contain null elements by using the noNullElements() method:

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

Зауважте, що ця перевірка все ще проходить, якщо масив порожній, доки в ньому немає нульових елементів.

9. Висновок

У цій статті ми дослідили клас Assert . Цей клас широко використовується в рамках Spring, але ми могли б легко написати більш надійний та виразний код, скориставшись цим.

Як завжди, повний код цієї статті можна знайти в проекті GitHub.