我在单元测试java代码时遇到了一些问题,这些代码有时会调用本机方法。基本上,我尝试使用PowerMockito
来模拟最终将调用native的类。我可以很好地模拟非void方法,但当我试图模拟void返回类型的方法时,我总是会遇到编译错误。以下是我尝试测试的代码示例:
public class ClassThatCallsNative {
void initObject(ByteBuffer param1, int param2) {
//calls native
}
int getId(int param1) {
//calls native
}
}
我的测试课上有这样的代码:
PowerMockito.when(mClassThatCallsNative.getId(Mockit.anyInt())).thenReturn(0);
这一行代码编译得很好,但下面一行是我得到编译错误的地方:
PowerMockito.when(mClassThatCallsNative.initObject(Mockit.any(ByteBuffer.class), anyInt())).doNothing();
错误消息只是指出无效的void参数并指向.initObject。知道我做错了什么吗?
由于您正在尝试模拟返回void的方法,因此根本无法在when()方法内部调用它。这是因为PowerMockito.when()方法期望T methodCall,但得到了void,这就是编译失败的原因。相反,您应该使用以下语法:
PowerMockito.doNothing().when(mClassThatCallsNative).initObject(any(ByteBuffer.class), anyInt())
any()和anyInt()方法是Mockito类的一部分。
对于void方法,您需要使用以下一个
PowerMockito.doNothing().when(mClassThatCallsNative.intObject(Mockit.any(ByteBuffer.class),anyInt())
终于弄清楚了问题所在。事实证明,我需要ClassThatCallsNative的实例来模拟它的方法。以前的情况是,对象是在构造函数调用中初始化的,但当我创建了另一个以ClassThatCallsNative为参数的构造函数,并将我的实例设置为该参数时,一切都很好。
无论如何,谢谢你!