JUnit: ложный вызов метода внутри статического метода - PullRequest
0 голосов
/ 06 июня 2019

С помощью PowerMock довольно легко издеваться над приватным методом. Но мой вариант использования - это смоделировать закрытый метод, который вызывается из статического метода Public.

Пример кода:

public class PrivateMethodMockExample {

    public int sumTwoNumbers() {
        int a = returnFirstNumber();
        int b = 5;
        return a + b;
    }

    public static int sumTwoNumbersStaticMethod() {
        PrivateMethodMockExample privateMethodMockExample = new PrivateMethodMockExample();
        int a = privateMethodMockExample.returnFirstNumber();
        int b = 5;
        return a + b;
    }

    private int returnFirstNumber() {
        return 10;
    }
}

Тестовый класс:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.junit.Assert.assertEquals;

@RunWith(PowerMockRunner.class)
@PrepareForTest(PrivateMethodMockExample.class)
public class PrivateMethodMockExampleTest {

    @Test
    public void testSumMethod() throws Exception {

        final String methodToTest = "returnFirstNumber";

        PrivateMethodMockExample instance = PowerMock.createPartialMock(PrivateMethodMockExample.class, methodToTest);
        PowerMock.expectPrivate(instance, methodToTest).andReturn(5);

        PowerMock.replay(instance);
        int result = instance.sumTwoNumbers();
        PowerMock.verify(instance);

        assertEquals(result, 10);
    }

    @Test
    public void testStaticSumMethod() throws Exception {

        final String methodToTest = "returnFirstNumber";

        PrivateMethodMockExample instance = PowerMock.createPartialMock(PrivateMethodMockExample.class, methodToTest);
        PowerMock.expectPrivate(instance, methodToTest).andReturn(5);

        PowerMock.replay(instance);
        int result = instance.sumTwoNumbersStaticMethod();
        PowerMock.verify(instance);

        assertEquals(result, 10);
    }
}

Первый тестовый пример успешно пройден, но второй тестовый пример не пройден. У меня такое ощущение, что я где-то концептуально ошибаюсь.

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

...