模拟传递给JNI的静态对象

时间:2019-02-26 21:06:51

标签: java-native-interface mockito powermockito

我正在尝试测试一些调用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接口中。在某些情况下,我还会根据对象的更改方式做出决定。

0 个答案:

没有答案