java - 如何对使用 JNI 的库进行单元测试?

标签 java unit-testing java-native-interface inversion-of-control

单元测试最佳实践要求使用控制反转,以确保单元测试彼此独立运行,即使它们依赖于单例实例(每个测试都有自己的“单例”)。

对于测试使用 JNI 来操作每个进程仅存在一次的 native 资源(例如终端)的库的建议是什么?

我不是在询问测试实际的 JNI 代码,而是在询问依赖于 native 代码作为副作用的 Java 代码。

最佳答案

和平常一样。

您创建您的测试代码(剪切)使用的库类的模拟,并验证您的剪切和该模拟之间的通信。

class JniUsageTest{

  @Rule 
  public MockitoRule mockitoRule = MockitoJUnit.rule(); 

  @Mock
  private JniInterfaceClass jni;

  @Test
  public void testJniCommunication_SomethingToWrite_PassedToInterface(){
    // arrange
    doReturn("the Answer from JNI").when(jni).calledByCut(any(Object.class));
    YorClassUnderTest cut = new YorClassUnderTest(jni);

    // act
    String resultContainingJniReturn =  cut.doSomethingExpectedToWtiteToJni();

    // assert
    verify(jni,times(10)).calledByCut(any(Object.class));
    assertThat(resultContainingJniReturn, containsString("the Answer from JNI"));
  }

}

关于java - 如何对使用 JNI 的库进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41663539/

相关文章:

java - 通过mockito设置值不起作用

java - JPanel 在更改背景时不保持颜色 alpha

java - ServiceConfigurationError:无法实例化SPI类:org.apache.lucene.codecs.compressing.FastCompressingCodec

java - 用 mockito 监视 lambda

c++ - JNI - 将类实例发送到 C++

java - 使用 JNI 将 float* 转换为 jfloatArray

java - 如何在 Java 中内存映射(mmap)一个 linux block 设备(例如/dev/sdb)?

java - 嵌入式 Jetty - 以编程方式添加基于表单的身份验证

java - 我应该如何指定托管 bean 方法来保存定向外键上的数据?

unit-testing - 从 TeamCity 运行时 dotCover 统计信息出错