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");// assertassertAll( () -> 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");// assertassertAll( () -> { 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
|
// arrangeString givenName = "Jean";String expectedCity = "Monona";String expectedAddress = "105 N. Lake St.";// actOptional<Owner> result = testObj.findByName(givenName);// assertassertThat(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
|
// arrangeString givenName = "Jean";String expectedCity = "Monona";String expectedAddress = "105 N. Lake St.";// actOptional<Owner> result = testObj.findByName(givenName);// assertassertThat(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, являются их собственными. |