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

时间:2017-01-15 16:39:26

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

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

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

我不是要求测试实际的JNI代码,而是考虑依赖于本机代码作为副作用的Java代码。

1 个答案:

答案 0 :(得分:0)

与往常一样。

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

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"));
  }

}