Почему 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
    }
Другие вопросы по тегам