С помощью 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);
}
}
Первый тестовый пример успешно пройден, но второй тестовый пример не пройден.
У меня такое ощущение, что я где-то концептуально ошибаюсь.
Конечно, могут быть долгие дебаты по проблеме дизайна кода. Но как-то мне нужно понять, как я могу пройти второй тестовый пример без рефакторинга исходного класса.