Въведение в AssertJ

Тази статия е част от поредица: • Въведение в AssertJ (текуща статия) • AssertJ за Гуава

• Характеристики на Java 8 на AssertJ

• Персонализирани твърдения с AssertJ

1. Общ преглед

В тази статия ще изследваме AssertJ - библиотека, управлявана от общността с отворен източник, използвана за писане на плавни и богати твърдения в Java тестове.

Тази статия се фокусира върху инструментите, налични в основния модул AssertJ, наречен AssertJ-core .

2. Зависимости на Maven

За да използвате AssertJ, трябва да включите следния раздел във вашия файл pom.xml :

 org.assertj assertj-core 3.4.1 test  

Тази зависимост обхваща само основните твърдения на Java. Ако искате да използвате разширени твърдения, ще трябва да добавите допълнителни модули отделно.

Имайте предвид, че за Java 7 и по-стари версии трябва да използвате ядрото на AssertJ версия 2.xx

Най-новите версии можете да намерите тук.

3. Въведение

AssertJ предоставя набор от класове и полезни методи, които ни позволяват лесно да пишем плавни и красиви твърдения за:

  • Стандартна Java
  • Java 8
  • Гуава
  • Joda Time
  • Neo4J и
  • Люлеещи се компоненти

Подробен списък на всички модули е достъпен на уебсайта на проекта.

Нека започнем с няколко примера, точно от документацията на AssertJ:

assertThat(frodo) .isNotEqualTo(sauron) .isIn(fellowshipOfTheRing); assertThat(frodo.getName()) .startsWith("Fro") .endsWith("do") .isEqualToIgnoringCase("frodo"); assertThat(fellowshipOfTheRing) .hasSize(9) .contains(frodo, sam) .doesNotContain(sauron);

Горните примери са само върхът на айсберга, но ни дайте преглед на това как може да изглежда писането на твърдения с тази библиотека.

4. AssertJ в действие

В този раздел ще се съсредоточим върху настройването на AssertJ и изследването на възможностите му.

4.1. Приготвяме се да започнем

С бурканчето на библиотеката в път на класа разрешаването на твърдения е толкова лесно, колкото добавянето на единичен статичен импорт към вашия тестов клас:

import static org.assertj.core.api.Assertions.*;

4.2. Писане на твърдения

За да напишете твърдение, винаги трябва да започнете, като предадете обекта си на метода Assertions.assertThat () и след това следвате действителните твърдения.

Важно е да запомните, че за разлика от някои други библиотеки, кодът по-долу всъщност още не твърди нищо и никога няма да провали тест:

assertThat(anyRefenceOrValue);

Ако се възползвате от функциите за завършване на кода на вашата IDE, писането на твърденията на AssertJ става невероятно лесно поради много описателните методи. Ето как изглежда в IntelliJ IDEA 16:

Функциите за завършване на кода на IDE

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

4.3. Твърдения за обекти

Обектите могат да се сравняват по различни начини или за определяне на равенството на два обекта, или за изследване на полетата на обект.

Нека разгледаме два начина, по които можем да сравним равенството на два обекта. Като се имат предвид следните два кучешки обекта fido и fidosClone :

public class Dog { private String name; private Float weight; // standard getters and setters } Dog fido = new Dog("Fido", 5.25); Dog fidosClone = new Dog("Fido", 5.25);

Можем да сравним равенството със следното твърдение:

assertThat(fido).isEqualTo(fidosClone);

Това ще се провали, тъй като isEqualTo () сравнява препратки към обекти. Ако вместо това искаме да сравним съдържанието им, можем да използваме isEqualToComparingFieldByFieldRecursively () така:

assertThat(fido).isEqualToComparingFieldByFieldRecursively(fidosClone);

Fido и fidosClone са равни, когато правят рекурсивно поле чрез сравнение на полета, защото всяко поле на един обект се сравнява с полето в другия обект.

Има много други методи за твърдение, които осигуряват различни начини за сравняване и свиване на обекти и за изследване и утвърждаване на техните полета. За да ги откриете всички, вижте официалната документация на AbstractObjectAssert .

4.4. Булеви твърдения

Съществуват няколко прости метода за тестване на истината:

  • истина е()
  • isFalse ()

Нека ги видим в действие:

assertThat("".isEmpty()).isTrue();

4.5. Iterable/Array Assertions

For an Iterable or an Array there are multiple ways of asserting that their content exist. One of the most common assertions would be to check if an Iterable or Array contains a given element:

List list = Arrays.asList("1", "2", "3"); assertThat(list).contains("1");

or if a List is not empty:

assertThat(list).isNotEmpty();

or if a List starts with a given character. For example “1”:

assertThat(list).startsWith("1");

Keep in mind that if you want to create more than one assertion for the same object, you can join them together easily.

Here is an example of an assertion that checks if a provided list is not empty, contains “1” element, does not contains any nulls and contains sequence of elements “2”, “3”:

assertThat(list) .isNotEmpty() .contains("1") .doesNotContainNull() .containsSequence("2", "3");

Of course many more possible assertions exist for those types. In order to discover them all, refer to the official AbstractIterableAssert documentation.

4.6. Character Assertions

Assertions for character types mostly involve comparisons and even checking if a given character is from a Unicode table.

Here is an example of an assertion that checks if a provided character is not ‘a', is in Unicode table, is greater than ‘b' and is lowercase:

assertThat(someCharacter) .isNotEqualTo('a') .inUnicode() .isGreaterThanOrEqualTo('b') .isLowerCase();

For a detailed list of all character types' assertions, see AbstractCharacterAssert documentation.

4.7. Class Assertions

Assertions for Class type are mostly about checking its fields, Class types, presence of annotations and class finality.

If you want to assert that class Runnable is an interface, you need to simply write:

assertThat(Runnable.class).isInterface();

or if you want to check if one class is assignable from the other:

assertThat(Exception.class).isAssignableFrom(NoSuchElementException.class);

All possible Class assertions can be viewed in the AbstractClassAssert documentation.

4.8. File Assertions

File assertions are all about checking if a given File instance exists, is a directory or a file, has certain content, is readable, or has given extension.

Here you can see an example of an assertion that checks if a given file exists, is file and not a directory, can be readable and writable:

 assertThat(someFile) .exists() .isFile() .canRead() .canWrite();

All possible Class assertions can be viewed in the AbstractFileAssert documentation.

4.9. Double/Float/Integer Assertions

Double/Float/Integer and Other Number Types

Numeric assertions are all about comparing numeric values within or without a given offset. For example, if you want to check if two values are equal according to a given precision we can do the following:

assertThat(5.1).isEqualTo(5, withPrecision(1d));

Notice that we are using already imported withPrecision(Double offset) helper method for generating Offset objects.

For more assertions, visit AbstractDoubleAssert documentation.

4.10. InputStream Assertions

There is only one InputStream-specific assertion available:

  • hasSameContentAs(InputStream expected)

and in action:

assertThat(given).hasSameContentAs(expected);

4.11. Map Assertions

Map assertions allow you to check if a map contains certain entry, set of entries, or keys/values separately.

And here you can see an example of an assertions that checks if a given map is not empty, contains numeric key “2”, does not contain numeric key “10” and contains entry: key: 2, value: “a”:

assertThat(map) .isNotEmpty() .containsKey(2) .doesNotContainKeys(10) .contains(entry(2, "a"));

For more assertions, see AbstractMapAssert documentation.

4.12. Throwable Assertions

Throwable assertions allow for example: inspecting exception's messages, stacktraces, cause checking or verifying if an exception has been thrown already.

Let's have a look at the example of an assertion that checks if a given exception was thrown and has a message ending with “c”:

assertThat(ex).hasNoCause().hasMessageEndingWith("c");

For more assertions, see AbstractThrowableAssert documentation.

5. Describing Assertions

In order to achieve even higher verbosity level, you can create dynamically generated custom descriptions for your assertions. The key to doing this is the as(String description, Object… args) method.

If you define your assertion like this:

assertThat(person.getAge()) .as("%s's age should be equal to 100", person.getName()) .isEqualTo(100);

this is what you will get when running tests:

[Alex's age should be equal to 100] expected: but was:

6. Java 8

AssertJ се възползва напълно от функционалните функции на Java 8 за програмиране. Нека да се потопим в един пример и да го видим в действие. Първо нека видим как го правим в Java 7:

assertThat(fellowshipOfTheRing) .filteredOn("race", HOBBIT) .containsOnly(sam, frodo, pippin, merry);

Тук филтрираме колекция за състезанието Hobbit и в Java 8 можем да направим нещо подобно:

assertThat(fellowshipOfTheRing) .filteredOn(character -> character.getRace().equals(HOBBIT)) .containsOnly(sam, frodo, pippin, merry);

Ще проучим възможностите на Java8 на AssertJ в следваща статия от тази поредица. Горните примери са взети от уебсайта на AssertJ.

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

В тази статия разгледахме накратко възможностите, които AssertJ ни дава заедно с най-популярните твърдения за основните типове Java.

Прилагането на всички примери и кодови фрагменти може да бъде намерено в проект на GitHub.

Следваща » AssertJ за Гуава