Tha*_*man 53 java android unit-testing junit4
我在Android Studio中运行单元测试.我有一个Java类,使用以下代码加载本机库
static
{
System.loadLibrary("mylibrary");
}
Run Code Online (Sandbox Code Playgroud)
但是当我在我的src/test目录中测试这个类时,我得到了
java.lang.UnsatisfiedLinkError: no mylibrary in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1864)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
Run Code Online (Sandbox Code Playgroud)
如何才能找到原生.so库的路径,src/main/libs以便进行单元测试而不出错?
注:里面src/main/libs的目录我有3个子目录:armeabi,mips和x86.其中每一个都包含正确的.so文件.我正在使用非实验版本来构建NDK库.
我不想使用其他第三方测试库,因为我所有其他"纯"java类都可以进行单元测试.但如果那是不可能的,那么我愿意接受替代方案.
这是我的测试代码,它会抛出错误
@Test
public void testNativeClass() throws Exception
{
MyNativeJavaClass test = new MyNativeJavaClass("lalalal")
List<String> results = test.getResultsFromNativeMethodAndPutThemInArrayList();
assertEquals("There should be only three result", 3, results.size());
}
Run Code Online (Sandbox Code Playgroud)
如果您的测试需要该库,请使用 AndroidTest(在 下src/androidTest/...)而不是 junit 测试。这将允许您像在代码中的其他地方一样加载和使用本机库。
如果您的测试不需要该库,只需将系统负载包装在 try/catch 中。这将允许 JNI 类仍然在 junit 测试中工作(在 下src/test/...)并且这是一种安全的解决方法,因为它不太可能掩盖错误(如果确实需要本机库,其他东西肯定会失败)。从那里,您可以使用类似 mockito 的东西来排除仍然命中 JNI 库的任何方法调用。
例如在 Kotlin 中:
companion object {
init {
try {
System.loadLibrary("mylibrary")
} catch (e: UnsatisfiedLinkError) {
// log the error or track it in analytics
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11590 次 |
| 最近记录: |