如何对使用 JNI 的库进行单元测试?
How to unit test a library that uses JNI?
单元测试最佳实践要求使用控制反转来确保单元测试运行相互独立,即使它们依赖于单例实例(每个测试都有自己的"singleton") .
测试使用 JNI 操作每个进程仅存在一次的本机资源(例如终端)的库的建议是什么?
我不是在询问测试实际的 JNI 代码,而是在询问 Java 依赖于本机代码作为副作用的代码。
和往常一样
您创建了库的模拟 class 您的 测试中的代码 (cut) 使用并验证了您的 cut 与该模拟之间的通信。
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"));
}
}
单元测试最佳实践要求使用控制反转来确保单元测试运行相互独立,即使它们依赖于单例实例(每个测试都有自己的"singleton") .
测试使用 JNI 操作每个进程仅存在一次的本机资源(例如终端)的库的建议是什么?
我不是在询问测试实际的 JNI 代码,而是在询问 Java 依赖于本机代码作为副作用的代码。
和往常一样
您创建了库的模拟 class 您的 测试中的代码 (cut) 使用并验证了您的 cut 与该模拟之间的通信。
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"));
}
}