Mockito无法模拟java.lang.reflect.Method

问题描述

请帮助。

我有一个可以通过junit test进行测试的类。 课

@Override
public Object invoke(Object o,Method method,Object[] objects) throws Throwable {
    ...
    final Object toReturn = method.invoke(this.impl,objects);
    ...
}

我有测试班

@Test
public void test() throws Throwable {
        try {
            APIController apiController = new APIController(paramMock1,new Gson());
            Method method = apiController.getClass().getmethod("ping");
            methodMock = Mockito.mock(method.getClass()); **---> Fail**
            Mockito.donothing().when(methodMock).invoke(Mockito.anyObject(),Mockito.any());
            proxy.invoke(new Object(),method,new Object[]{});
        } catch (Exception ex) {
            Assert.assertTrue(ex instanceof NullPointerException);
        }
    }

错误消息是

Cannot mock/spy class java.lang.reflect.Method
Mockito cannot mock/spy following:
  - final classes
  - anonymous classes
  - primitive types` 

我做了一些研究并添加

@RunWith(powermockrunner.class)

在测试类之上,但仍然出现错误

如何使用该方法的模拟进行测试?谢谢。

解决方法

PowerMock和Mockito是不同的模拟框架,因此仅添加@RunWith(PowerMockRunner.class)注释将无法解决您的问题。 Powermock 可以有用(我不太熟悉,所以在这里不确定),但是您需要重写测试以使用它而不是模仿。

但是从我看来,您很可能不需要模拟Method类-对于您的任务,只需模拟要模拟的 object 就足够了方法。像这样:

APIController apiController = mock(APIController.class);
doNothing().when(apiController).ping(...);
// pass the mocked apiController to your proxy;
// test that proxy.invoke calls the ping method