Статьи

Использование Mockito без статического импорта с Java 8

Как упростить использование Mockito путем удаления статического импорта в проектах на основе Java 8.

обоснование

API-интерфейс Mockito основан на статических методах, агрегированных (в основном) в классе (BDD) Mockito, за которым следуют чрезвычайно быстрые, цепочечные вызовы методов. Создание макета, создание заглушки и проверка вызова могут быть инициированы статическими методами mock / spy / дали / then / verify:

01
02
03
04
05
06
07
08
09
10
11
@Test
public void shouldVerifyMethodExecution() {
    //given
    TacticalStation tsSpy = BDDMockito.spy(TacticalStation.class);
    BDDMockito.willDoNothing().given(tsSpy).fireTorpedo(2);
    //when
    tsSpy.fireTorpedo(2);
    tsSpy.fireTorpedo(2);
    //then
    BDDMockito.then(tsSpy).should(BDDMockito.times(2)).fireTorpedo(2);
}

Довольно многословно, но начиная с Java 5 можно использовать статический импорт для упрощения кода, но за счет дополнительного статического импорта:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
import static org.mockito.BDDMockito.then;
import static org.mockito.BDDMockito.willDoNothing;
import static org.mockito.BDDMockito.spy;
import static org.mockito.BDDMockito.times;
(...)
 
@Test
public void shouldVerifyMethodExecution() {
    //given
    TacticalStation tsSpy = spy(TacticalStation.class);
    willDoNothing().given(tsSpy).fireTorpedo(2);
    //when
    tsSpy.fireTorpedo(2);
    tsSpy.fireTorpedo(2);
    //then
    then(tsSpy).should(times(2)).fireTorpedo(2);
}

Импорт может быть скрыт в IDE и обычно не сильно беспокоит. Тем не менее, чтобы иметь возможность писать только имя метода (например, mock(TacticalStation.class) ) без класса, необходимо нажать ALT-ENTER (в IntelliJ IDEA), чтобы добавить каждый статический импорт при первом использовании данного метода в тестовый класс. Ситуация еще хуже в Eclipse, где требуется ранее добавить BDDMockito в «Favorites» в «Content Assist», чтобы сделать его предложенным IDE. Ребята из Eclipse могут сказать: «Вы должны сделать это только один раз», но, как я испытал во время моих тренировок по тестированию / TDD, это делает кривую обучения (использования) Mockito немного круче.

Конечно, есть некоторые приемы, такие как использование звездообразного импорта по умолчанию для классов Mockito, чтобы уменьшить количество требуемых нажатий клавиш, но если вы используете Java 8 в своем проекте (надеюсь, что большинство из вас), есть более простой способ справиться с этим.

Статический импорт свободный подход

Mockito-Java8 2.0.0 (и его аналог для Mockito 1.10.x — версия 1.0.0) представляет набор интерфейсов, которые предоставляют все методы из Mockito API. При «внедрении» их в тестовый класс все эти методы автоматически становятся доступными в письменных тестах:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
//no static imports needed!
 
public class SpaceShipTest implements WithBDDMockito {
 
    @Test
    public void shouldVerifyMethodExecution() {
        //given
        TacticalStation tsSpy = spy(TacticalStation.class);
        willDoNothing().given(tsSpy).fireTorpedo(2);
        //when
        tsSpy.fireTorpedo(2);
        tsSpy.fireTorpedo(2);
        //then
        then(tsSpy).should(times(2)).fireTorpedo(2);
    }
}

Код выглядит точно так же, как в предыдущем фрагменте, но нет необходимости выполнять какой-либо статический импорт (кроме обычного импорта самого WithBDDMockito).

Под капотом WithBDDMockito интерфейса WithBDDMockito очень проста. Все методы являются методами по умолчанию, которые просто делегируют надлежащий статический метод в классе BDDMockito .

1
2
3
default <T> BDDMockito.BDDMyOngoingStubbing<T> given(T methodCall) {
    return BDDMockito.given(methodCall);
}

Ароматы Мокито

Методы Mockito предоставляются 3 базовыми интерфейсами, являющимися точками входа для данного набора методов:

  • WithBDDMockito — API- WithBDDMockito / насмешка в стиле BDD (предоставляет также классический API).
  • WithMockito — классический API- WithMockito
  • WithAdditionalMatchers — дополнительные сопоставители Mokcito (базовый аккаунт включен в With (BDD) Mockito)

Резюме

Java 8 открыла новые возможности, как (тест) код может быть написан в более компактном и удобочитаемом виде. Бесплатный статический импорт кода Mockito может немного упростить написание тестов, но в Mockito-Java8 уже есть больше возможностей и даже больше, которые будут включены в Mockito 3.0 (те, для которых внутренние компоненты Mokcito должны быть изменены без обратной совместимости) , Если вы возьмете больше идей о том, как можно реорганизовать код / ​​проекты, чтобы получить выгоду от Java 8, вы можете увидеть мою короткую презентацию «Java 8 дает силу для тестирования!» ( слайды и видео ).

Mockito-Java8 2.0-beta (для Mockito> = 2.0.22-beta) и 1.0.0-beta (для Mockito 1.10.x и более ранних бета-версий Mockito 2) доступны через Maven Central . Версии должны быть довольно стабильными, но я хотел бы получить более широкую обратную связь об этой новой функции, поэтому она помечена как бета-версия. Более подробную информацию можно найти на веб-странице проекта .

Подтвердить . Идея была первоначально предложена Дэвидом Гагеотом (парень из Infinitest ) в одном из своих постов в блоге .

Ссылка: Использование Mockito без статического импорта с Java 8 от нашего партнера JCG Марцина Заячковского в блоге Solid Soft .