Статьи

Удобный макет в Mockito с JUnit 5 — официальный путь

Начиная с версии 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()
    maven { url "https://dl.bintray.com/mockito/maven" }    //for development versions of Mockito
}

Кроме того, было бы бесполезно не использовать совершенно новую встроенную поддержку для выполнения теста 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, являются их собственными.