Статьи

JUnit 5 встречает AssertJ

JUnit 5 вносит множество улучшений в библиотеку утверждений, в основном благодаря поддержке Java 8 и Lambda Expression, а также благодаря наличию новых утверждений, таких как assertAll , assertTimeout или assertThrows . Хотя мне действительно нравится JUnit 5, я считаю, что AssertJ по-прежнему является обязательным в модульных тестах промышленного уровня, и я буду продолжать его использовать.

Но я думаю, что есть потенциальные сценарии смешивания JUnit 5 и AssertJ в одном модульном тесте: один из них — это смешивание JUnit assertAll с AssertJ assertThat .

JUnit 5 — assertAll

Assertions.assertAll утверждает, что все предоставленные исполняемые файлы не генерируют исключения:

1
2
3
4
5
6
7
8
List<String> owners = Arrays.asList("Betty Davis", "Eduardo Rodriquez");
 
// assert
assertAll(
    () -> assertTrue(owners.contains("Betty Doe"), "Contains Betty Doe"),
    () -> assertTrue(owners.contains("John Doe"), "Contains John Doe"),
    () -> assertTrue(owners.contains("Eduardo Rodriquez"), "Eduardo Rodriquez")
);

Выше будет сообщать о 2 ошибках:

1
2
3
org.opentest4j.MultipleFailuresError: Multiple Failures (2 failures)
    Contains Betty Doe ==> expected: <true> but was: <false>
    Contains John Doe ==> expected: <true> but was: <false>

assertAll выполняет все переданные исполняемые файлы и assertAll все передачи (не выбрасывайте исключение). Другими словами, assertAll позволяет группировать утверждения.

Кроме того, assertAll может использоваться для создания зависимых утверждений:

01
02
03
04
05
06
07
08
09
10
11
12
13
List<String> owners = Arrays.asList("Betty Davis", "Eduardo Rodriquez");
 
// assert
assertAll(
    () -> {
        assertTrue(owners.contains("Betty Doe"), "Contains Betty Doe");
 
        assertAll(
            () -> assertNotNull(owners),
            () -> assertTrue(owners.size() > 1)
        );
    }
);

В приведенном выше примере, когда первый assertTrue терпит неудачу, последующий assertAll будет пропущен.

AssertJ — SoftAssertions

Примечание: я написал больше о SoftAssertions в этой статье: Мягкие утверждения AssertJ — нужны ли они нам?

AssertJ предлагает SoftAssertions которые в основном делают то же самое, что и JUnit 5 assertAll с небольшим отличием в том, что они не поддерживают зависимые утверждения.

1
2
3
4
5
6
7
8
9
List<String> owners = Arrays.asList("Betty Davis", "Eduardo Rodriquez");
 
assertSoftly(
    softAssertions -> {
        softAssertions.assertThat(owners).contains("Betty Doe");
        softAssertions.assertThat(owners).contains("John Doe");
        softAssertions.assertThat(owners).contains("Eduardo Rodriquez");
    }
);

Сообщенные ошибки:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
1)
Expecting:
 <["Betty Davis", "Eduardo Rodriquez"]>
to contain:
 <["Betty Doe"]>
but could not find:
 <["Betty Doe"]>
 
at AssertJAssertionsTest.lambda$assertsSoftly$0(AssertJAssertionsTest.java:26)
2)
Expecting:
 <["Betty Davis", "Eduardo Rodriquez"]>
to contain:
 <["John Doe"]>
but could not find:
 <["John Doe"]>

Смешивание JUnit assertAll с AssertJ assertThat

Смешивание JUnit 5 assertAll с AssertJ assertThat кажется, хороший вариант:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
// arrange
String givenName = "Jean";
String expectedCity = "Monona";
String expectedAddress = "105 N. Lake St.";
 
// act
Optional<Owner> result = testObj.findByName(givenName);
 
// assert
assertThat(result).isPresent();
 
assertAll(
    () -> assertThat(result.get().getFirstName()).isEqualTo(givenName),
    () -> assertThat(result.get().getCity()).isEqualTo(expectedCity),
    () -> assertThat(result.get().getAddress()).isEqualTo(expectedAddress)
);

С другой стороны, assertAll может использоваться как параметр для assertThat :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
// arrange
String givenName = "Jean";
String expectedCity = "Monona";
String expectedAddress = "105 N. Lake St.";
 
// act
Optional<Owner> result = testObj.findByName(givenName);
 
// assert
assertThat(result).hasValueSatisfying(owner -> assertAll(
    () -> assertThat(owner.getFirstName()).isEqualTo(givenName),
    () -> assertThat(owner.getCity()).isEqualTo(expectedCity),
    () -> assertThat(owner.getAddress()).isEqualTo(expectedAddress)
));

Резюме

Хотя JUnit 5 является отличным фреймворком и предлагает много возможностей для утверждений, я считаю, что сторонняя библиотека утверждений, такая как AssertJ, нужна в любом случае, чтобы немного оживить утверждения. Я использую AssertJ уже несколько лет и не думаю, что откажусь от него. Но я определенно вижу место для нового JUnit 5 assertAll в моих тестах. Особенно в интеграционных тестах.

Все примеры из этого поста (и многое другое) можно найти в этом репозитории GitHub: https://github.com/kolorobot/junit5-samples *

* Большое спасибо Maciej Koziara, который внес вклад в этот репозиторий.

Смотреть оригинальную статью здесь: JUnit 5 встречает AssertJ

Мнения, высказанные участниками Java Code Geeks, являются их собственными.