问题描述
请帮助。
@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