我正在尝试测试一些调用JNI的代码。我的代码类似于以下内容:
public final class SomeJniClass {
public static native void SomeJniClass_someMethod(SomeObject someObject);
}
public class SomeObject {
boolean value;
public boolean getValue() {
return value;
}
public boolean setValue(boolean value) {
this.value = value;
}
}
public class ToBeTested {
public boolean wasChanged() {
SomeObject someObject = new SomeObject();
SomeJniClass.SomeJniClass_someMethod(someObject);
return someObject.getValue();
}
}
现在,它在本机代码中修改了value
。通常,我会提倡将代码重构为使用工厂,在某些情况下,我这样做是为了允许我注入模拟,但由于这样做的地方数量众多,而且调用的复杂性我不确定我是否有时间做一个完整的重构。
在编写此问题之前,我尝试过https://stackoverflow.com/a/18069829/2599884,但是当我在测试中修改值时,它们似乎从未改变。我只是得到了new SomeObject()
的默认状态,这使我产生了偏执狂,因此我做了一个可怜的人调试,并在其中进行了一些日志记录,似乎从未发生过匹配。以下基本上是我班级的样子:
logger.log(Leve.WARNING, "Before!");
PowerMockito.doAnswer( invocation -> {
logger.log(Leve.WARNING, "Inside!");
Object[] args = invocation.getArguments();
((SomeObject) args[0]).setValue(true);
return null;
}).when(SomeJniClass.class);
SomeJniClass.SomeJniClass_someMethod(Mockito.any(SomeObject.class));
logger.log(Leve.WARNING, "After!");
现在,以上是最基本的示例。我确实有一些更复杂的对象正在传递到JNI接口中。在某些情况下,我还会根据对象的更改方式做出决定。