Насмешка над приватными методами с помощью PowerMock

Пересмешивание частных методов с использованием PowerMock

1. обзор

Одной из проблем модульного тестирования является издевательство над частными методами.

В этом руководстве мы узнаем, как этого добиться с помощью библиотекиPowerMock, которая поддерживается JUnit и TestNG.

PowerMock integrates with mocking frameworks like EasyMock and Mockito and is meant to add additional functionality to these – such as mocking private methods, final classes, and final methods, и т. д.

Он делает это, полагаясь на манипулирование байт-кодом и совершенно отдельный загрузчик классов.

2. Maven Зависимости

Во-первых, давайте добавим необходимые зависимости для использования PowerMock с Mockito и JUnit в нашpom.xml:


    org.powermock
    powermock-module-junit4
    1.7.3
    test


    org.powermock
    powermock-api-mockito2
    1.7.3
    test

Последние версии можно проверитьhere иhere.

3. пример

Давайте начнем с примераLuckyNumberGenerator.. Этот класс имеет единственный общедоступный метод для генерации счастливого числа:

public int getLuckyNumber(String name) {
    saveIntoDatabase(name);
    if (name == null) {
        return getDefaultLuckyNumber();
    }
    return getComputedLuckyNumber(name.length());
}

4. Варианты издевательств над частными методами

Для исчерпывающего модульного тестирования метода нам потребуется имитировать частные методы.

4.1. Метод без аргументов, но с возвращаемым значением

В качестве простого примера давайте имитируем поведение частного метода без аргументов и заставим его возвращать желаемое значение:

LuckyNumberGenerator mock = spy(new LuckyNumberGenerator());

when(mock, "getDefaultLuckyNumber").thenReturn(300);

В этом случае мы имитируем частный методgetDefaultLuckyNumber и заставляем его возвращать значение 300.

4.2. Метод с аргументом и возвращаемым значением

Затем давайте смоделируем поведение частного метода с аргументом и заставим его вернуть желаемое значение:

LuckyNumberGenerator mock = spy(new LuckyNumberGenerator());

doReturn(1).when(mock, "getComputedLuckyNumber", ArgumentMatchers.anyInt());

В этом случае мы высмеиваем приватный метод и возвращаем 1.

Обратите внимание, что нас не волнует входной аргумент, и мы используемArgumentMatchers.anyInt() как подстановочный знак.

4.3. Проверка вызова метода

Наша последняя стратегия - использовать PowerMock для проверки вызова частного метода:

LuckyNumberGenerator mock = spy(new LuckyNumberGenerator());
int result = mock.getLuckyNumber("Tyranosorous");

verifyPrivate(mock).invoke("saveIntoDatabase", ArgumentMatchers.anyString());

5. Слово предостережения

Наконец, хотя частные методы можно протестировать с помощью PowerMock,we must be extra cautious while using this technique.

Учитывая, что целью нашего тестирования является проверка поведения класса, мы должны воздерживаться от изменения внутреннего поведения класса во время модульного тестирования.

Методы имитации должны применяться к внешним зависимостям класса, а не к самому классу.

Если насмешка над частными методами необходима для тестирования наших классов, это обычно указывает на плохой дизайн.

6. Заключение

В этой быстрой статье мы показали, как PowerMock можно использовать для расширения возможностей Mockito для проверки и проверки личных методов в тестируемом классе.

Исходный код этого руководства можно найтиover on GitHub.