Начиная с версии 2.17.0, Mockito предоставляет официальную (встроенную) поддержку для управления жизненным циклом макетов, если используется JUnit 5 .
Начиная
Чтобы воспользоваться преимуществами интеграции, необходимо добавить зависимость mockito-junit-jupiter
рядом с junit-platform-engine
системы JUnit 5 (подробности см. Ниже).
После этого должно быть включено новое расширение MockitoException
для JUnit 5. И этого достаточно. Вся аннотация Mockito должна автоматически начать работать.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
import org.junit.jupiter.api.Test; //do not confuse with 'org.junit.Test'! //other imports import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith (MockitoExtension. class ) class SpaceShipJUnit5Test { @InjectMocks private SpaceShip spaceShip; @Mock private TacticalStation tacticalStation; @Mock private OperationsStation operationsStation; @Test void shouldInjectMocks() { assertThat(spaceShip).isNotNull(); assertThat(tacticalStation).isNotNull(); assertThat(operationsStation).isNotNull(); assertThat(spaceShip.getTacticalStation()).isSameAs(tacticalStation); assertThat(spaceShip.getOperationsStation()).isSameAs(operationsStation); } } |
Приятно, что и тестовый класс, и тестовые методы больше не должны быть публичными.
Пожалуйста, обратите внимание . Имея также JUnit 4 на пути к классам (например, через junit-vintage-engine
) для «устаревшей» части тестов, важно не путать org.junit.jupiter.api.Test
со старым org.junit.Test
. Он не будет работать.
Заглушка и проверка
Если по каким-либо причинам вы не являетесь поклонником AssertJ (хотя я рекомендую вам хотя бы попробовать), JUnit 5 предоставляет встроенное утверждение assertThrows
(которое очень похоже на assertThatThrownBy()
из AssertJ). Это обеспечивает значимое сообщение об ошибке в случае ошибки подтверждения.
1
2
3
4
5
6
7
8
9
|
@Test void shouldMockSomething() { //given willThrow(SelfCheckException. class ).given(tacticalStation).doSelfCheck(); //void method "given..will" not "when..then" cannot be used //when Executable e = () -> spaceShip.doSelfCheck(); //then assertThrows(SelfCheckException. class , e); } |
Я не был бы собой, если бы не упомянул здесь, что благодаря поддержке методов по умолчанию в интерфейсах, доступных в AssertJ и mockito-java8, многие статические операции импорта могут быть избыточными.
1
2
3
4
|
@ExtendWith (MockitoExtension. class ) class SpaceShipJUnit5Test implements WithAssertions, WithBDDMockito { ... } |
Тонкая настройка по умолчанию
Также стоит отметить, что при использовании расширения JUnit 5 Mockito по умолчанию работает в «строгом режиме» . Это означает, что, например, ненужные заглушки не пройдут тест. Хотя очень часто это пахнет кодом, в некоторых случаях такая конструкция теста желательна. Чтобы изменить поведение по @MockitoSettings
можно использовать аннотацию @MockitoSettings
.
1
2
3
4
5
|
@ExtendWith (MockitoExtension. class ) @MockitoSettings (strictness = Strictness.WARN) class SpaceShipJUnitAdvTest implements WithAssertions, WithBDDMockito { .... } |
зависимости
Как я уже упоминал, для начала использования необходимо добавить зависимость mockito-junit-jupiter
jupiter в mockito-junit-jupiter
рядом с junit-platform-engine
в JUnit 5. В сборке Gradle это может выглядеть так:
1
2
3
4
5
6
7
|
dependencies { testCompile 'org.junit.vintage:junit-platform-engine:5.1.0' testCompile 'org.mockito:mockito-junit-jupiter:2.17.2' //mockito-core is implicitly added testCompile 'org.junit.vintage:junit-vintage-engine:5.1.0' //for JUnit 4.12 test execution, if needed testCompile 'org.assertj:assertj-core:3.9.1' //if you like it (you should 😉 ) } |
Пожалуйста, обратите внимание . Из-за ошибки, связанной с введением макетов через конструктор в последние поля, которые я обнаружил при написании этого поста в блоге, рекомендуется использовать как минимум версию 2.17.2 вместо 2.17.0. Эта «разрабатываемая» версия недоступна в Maven Central, и необходимо добавить дополнительный репозиторий Bintray.
1
2
3
4
|
repositories { mavenCentral() } |
Кроме того, было бы бесполезно не использовать совершенно новую встроенную поддержку для выполнения теста JUnit 5 в Gradle 4.6+ .
1
2
3
|
test { useJUnitPlatform() } |
IntelliJ IDEA предоставляет поддержку JUnit с 2016 года.2 (на тот момент JUnit 5 Milestone 2). Eclipse Oxygen также, похоже, недавно добавил поддержку JUnit 5.
Резюме
Очень приятно иметь встроенную поддержку JUnit 5 в Mockito. Не забегая вперед, идет постоянная работа, чтобы сделать его еще лучше.
Эта функция была реализована Кристианом Шварцем и отполирована Тимом ван дер Липпе при большой помощи нескольких других людей .
Исходный код доступен на GitHub .
Смотреть оригинальную статью здесь: Удобный макет в Mockito с JUnit 5 — официальный путь
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |