Начиная с версии 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 importsimport 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
|
@Testvoid 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, являются их собственными. |
