Статьи

Статический импорт и Mockito с Java 8

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

@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, можно использовать статический импорт для упрощения кода, но за счет дополнительного статического импорта:

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«Избранное» в «Ассистент контента», чтобы сделать его предложенным IDE. Ребята из Eclipse могут сказать: «Вы должны сделать это только один раз», но, как я испытал во время моих тренировок по тестированию / TDD, это делает кривую обучения (использования) Mockito немного круче.

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

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

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

//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реализация интерфейса предельно проста. Все методы являются методами по умолчанию, которые просто делегируют правильный статический метод в BDDMockitoклассе.

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

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

Методы Mockito обеспечиваются тремя базовыми интерфейсами, являющимися точками входа для данного набора методов:
WithBDDMockitoAPI- интерфейс для создания заглушек / насмешек в стиле BDD (предоставляет также классический API).
WithMockito— классический API- интерфейс для заглушки / насмешки
WithAdditionalMatchers— дополнительные сопоставители Mokcito (базовая учетная запись включена в With (BDD) Mockito )

Резюме

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

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

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