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, являются их собственными. |