Нотатка з оглядом базових можливостей модуля assertj-core:
AssertJ окрім великого вбудованого набору assertions також надає можливість створювати власні твердження, що дозволяє тестам краще відображати вашу доменну модель.
Для прикладу в якості тестованого класу буде використовуватись клас Person (getters та setters скорочено):
package wiki.it.notes.assertJ.customAssert;
public class Person {
private String firstName;
private String lastName;
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}Клас з custom assertions для Person
package wiki.it.notes.assertJ.customAssert;
import org.assertj.core.api.AbstractAssert;
import java.util.Objects;
public class PersonAssert extends AbstractAssert<PersonAssert, Person> {
protected PersonAssert(Person actual) {
super(actual, PersonAssert.class);
}
public static PersonAssert assertThat(Person actual) {
return new PersonAssert(actual);
}
public PersonAssert hasFullName(Person expctedPerson) {
isNotNull();
var actualFullName = actual.getFirstName() + " " + actual.getLastName();
var expectedFullName = expctedPerson.getFirstName() + " " + expctedPerson.getLastName();
if(!Objects.equals(actualFullName, expectedFullName)) {
failWithMessage("\nExpected person full name to be <%s> but was <%s>", expectedFullName, actualFullName);
}
return this;
}
}- для створення класу з кастомними твердженнями нам потрібно наслідуватись від AbstractAssert, та вказати два generic параметри (перший – поточний клас, другий – клас який ми збираємось тестувати)
- конструктор класу приймає на вхід об’єкт, стосовно якого будуть робитися твердження
- статичний метод assertThat слугує точкою входу в клас PersonAssert, він буде використовуватись для запуску ланцюжка тверджень
- нарешті hasFullName є кастомним твердженням, в якості параметру приймає посилання на об’єкт з очікуваним результатом. Всередині нього метод isNotNull перевіряє, чи не являється актуальний об’єкт Person null
Використання custom assert
Попередньо зробимо статичний імпорт PersonAssert.assertThat:
import static wiki.it.notes.assertJ.customAssert.PersonAssert.assertThat;Тепер протестуємо об’єкт Person:
var actualPerson = new Person("Alexandros", "Riggs");
var expectedPerson = new Person("Alexandros", "Conley");
assertThat(actualPerson).hasFullName(expectedPerson);Результат виконання (я навмисно зробив помилку, щоб побачити роботу твердження):
Exception in thread "main" java.lang.AssertionError:
Expected person full name to be <Alexandros Conley> but was <Alexandros Riggs>