Search code examples
javajunit4powermockito

Why Powermockito invokes my mocked method?


I want to mock private method, which called from my test method, but instead of mocking, PowerMockito invoke toMockMethod, and I get NPE. toMockMethod is in the same class.

@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);
    }
}

Is it normal situation? What a sense to mock method if it has been invoked?


Solution

  • To enable static or non-public mocking with PowerMock for a class, the class should be added to annotation @PrepareForTest. In your case, it should be:

    @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);
        }
    }