Почему Powermockito вызывает мой издевательский метод?
Я хочу смоделировать закрытый метод, который вызывается из моего тестового метода, но вместо имитации PowerMockito вызывает toMockMethod, и я получаю NPE. toMockMethod находится в том же классе.
@RunWith(PowerMockRunner.class)
public class PaymentServiceImplTest {
private IPaymentService paymentService;
@Before
public void init() {
paymentService = PowerMockito.spy(Whitebox.newInstance
(PaymentServiceImpl.class));
MockitoAnnotations.initMocks(this);
}
@Test
public void test() throws Exception {
...
PowerMockito.doReturn(mockedReturn)
.when(paymentService,
"toMockMethod",
arg1, arg2);
}
}
Это нормальная ситуация? Какой смысл издеваться над методом, если он был вызван?
1 ответ
Чтобы включить статический или непубличный макет с PowerMock для класса, класс должен быть добавлен в аннотацию @PrepareForTest
, В вашем случае это должно быть:
@RunWith(PowerMockRunner.class)
@PrepareForTest(PaymentServiceImpl.class)
public class PaymentServiceImplTest {
private IPaymentService paymentService;
@Before
public void init() {
paymentService = PowerMockito.spy(Whitebox.newInstance
(PaymentServiceImpl.class));
MockitoAnnotations.initMocks(this);
}
@Test
public void test() throws Exception {
...
PowerMockito.doReturn(mockedReturn)
.when(paymentService,
"toMockMethod",
arg1, arg2);
}
}
Я оставлю здесь второй ответ для себя в будущем. Здесь есть альтернативная проблема. Если вы вызываете Static.method, убедитесь, что "метод" действительно определен в Static, а не вверх по иерархии.
В моем случае код называется Static.method, но Static расширяется от StaticParent, а "метод" фактически определен в StaticParent.
@RunWith(PowerMockRunner.class)
@PrepareForTest(StaticParent.class)
public class YourTestClass {
@Before
public init() {
PowerMockito.mockStatic(StaticParent.class);
when(StaticParent.method("")).thenReturn(yourReturnValue);
}
}
public class ClassYoureTesting {
public someMethod() {
Static.method(""); // This returns yourReturnValue
}