Макет статического метода с использованием JMockit

Ложный статический метод с использованием JMockit

1. обзор

Некоторые популярные библиотеки имитации, такие какMockito and Easymock, генерируют макеты, используя преимущества модели классов Java, основанной на наследовании. EasyMock implements an interface at runtime, whereas Mockito inherits from the target class to create a mocking stub.

Ни один из подходов не работает хорошо для статических методов, поскольку статические методы связаны с классом и не могут быть переопределены. ОднакоJMockit does provide a static method mocking features.

В этом руководстве мы рассмотрим некоторые из этих функций.

Для введения в JMockit см. Нашprevious article.

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

Начнем с зависимостей Maven:


    org.jmockit
    jmockit
    1.24
    test

Вы можете найти последние версии этих библиотек наMaven Central.

3. Статический метод, вызываемый из нестатического метода

Сначала давайте рассмотрим случай, когда у нас естьa class with a non-static method that internally depends upon static method:

public class AppManager {

    public boolean managerResponse(String question) {
        return AppManager.isResponsePositive(question);
    }

    public static boolean isResponsePositive(String value) {
        if (value == null) {
            return false;
        }
        int length = value.length();
        int randomNumber = randomNumber();
        return length == randomNumber ? true : false;
    }

    private static int randomNumber() {
        return new Random().nextInt(7);
    }
}

Теперь мы хотим протестировать методmanagerResponse().. Поскольку его возвращаемое значение зависит от другого метода, нам нужно смоделировать методisResponsePositive().

Мы можем имитировать этот статический метод, используя анонимный классJMockit’smockit.MockUp.MockUp<T> (where T will be the class name) и саннотацию@Mock :

@Test
public void givenAppManager_whenStaticMethodCalled_thenValidateExpectedResponse() {
    new MockUp() {
        @Mock
        public boolean isResponsePositive(String value) {
            return false;
        }
    };

    assertFalse(appManager.managerResponse("Some string..."));
}

Здесь мы имитируемisResponsePositive() с возвращаемым значением, которое мы хотели бы использовать для теста. Следовательно, проверка ожидаемого результата с помощью утилитыAssertions, доступной в Junit-5.

4. Проверить частный статический метод

В некоторых случаях другие методы используют частные статические методы класса:

private static Integer stringToInteger(String num) {
    return Integer.parseInt(num);
}

Для тестирования такого методаwe’d need to mock private static method. Мы можем использовать метод полезностиDeencapsulation.invoke() , предоставляемыйJMockit:

@Test
public void givenAppManager_whenPrivateStaticMethod_thenValidateExpectedResponse() {
    int response = Deencapsulation.invoke(AppManager.class, "stringToInteger", "110");
    assertEquals(110, response);
}

Как следует из названия, его цель -de-encapsulate состояние объекта. Таким образом, JMockit упрощает методы тестирования, которые не могут быть протестированы иначе.

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

В этой статье мы увидели, как можно смоделировать статические методы с помощьюJMockit. Для более глубокого изучения некоторых расширенных функций JMockit, взгляните на наш JMockit Advanced Usagearticle.

Как обычно, полный исходный код этого руководства доступенover on GitHub.