Как я могу издеваться над частным статическим методом с PowerMockito?
Я пытаюсь высмеять частный статический метод anotherMethod()
. См. Код ниже
public class Util {
public static String method(){
return anotherMethod();
}
private static String anotherMethod() {
throw new RuntimeException(); // logic was replaced with exception.
}
}
Вот мой тестовый код
@PrepareForTest(Util.class)
public class UtilTest extends PowerMockTestCase {
@Test
public void should_prevent_invoking_of_private_method_but_return_result_of_it() throws Exception {
PowerMockito.mockStatic(Util.class);
PowerMockito.when(Util.class, "anotherMethod").thenReturn("abc");
String retrieved = Util.method();
assertNotNull(retrieved);
assertEquals(retrieved, "abc");
}
}
Но каждый элемент, который я запускаю, получаю это исключение
java.lang.AssertionError: expected object to not be null
Я полагаю, что я делаю что-то не так с насмешкой. Любые идеи, как я могу это исправить?
Ответы
Ответ 1
Для этого вы можете использовать PowerMockito.spy(...)
и PowerMockito.doReturn(...)
.
Кроме того, вы должны указать Runner PowerMock в своем тестовом классе, как показано ниже:
@PrepareForTest(Util.class)
@RunWith(PowerMockRunner.class)
public class UtilTest {
@Test
public void testMethod() throws Exception {
PowerMockito.spy(Util.class);
PowerMockito.doReturn("abc").when(Util.class, "anotherMethod");
String retrieved = Util.method();
Assert.assertNotNull(retrieved);
Assert.assertEquals(retrieved, "abc");
}
}
Надеюсь, это поможет вам.
Ответ 2
Если anotherMethod() принимает любой аргумент как anotherMethod (параметр), правильным вызовом метода будет:
PowerMockito.doReturn("abc").when(Util.class, "anotherMethod", parameter);
Ответ 3
Я не уверен, какую версию PowerMock вы используете, но с более поздней версией вы должны использовать @RunWith(PowerMockRunner.class)
@PrepareForTest(Util.class)
Говоря об этом, я считаю, что использование PowerMock действительно проблематично и является верным признаком плохого дизайна. Если у вас есть время/возможность изменить дизайн, я бы попытался сделать это в первую очередь.