加载本机库的单元测试 Java 类

2022-08-31 14:26:00

我正在Android Studio中运行单元测试。我有一个Java类,它使用以下代码加载本机库

 static
    {
       System.loadLibrary("mylibrary");
    }

但是当我在我的目录中测试这个类时,我得到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)

我怎样才能让它找到位于的本机.so库的路径,以便进行单元测试而不会出错?src/main/libs

注意:在目录中,我还有3个子目录:,和。其中每个都包含正确的 .so 文件。我正在使用非实验版本来构建NDK库。src/main/libsarmeabimipsx86

我不想使用其他第三方测试库,因为我的所有其他“纯”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());
    }

答案 1

我发现唯一一个没有黑客攻击的解决方案是通过检测测试(androidTest目录)使用JUnit。我的类现在可以很好地测试,但在Android设备或模拟器的帮助下。


答案 2

如果您的测试需要该库,请使用 AndroidTest(在 下),而不是 junit 测试。这将允许您加载和使用本机库,就像您在代码中的其他位置所做的那样。src/androidTest/...

如果您的测试不需要该库,只需将系统负载包装在 try/catch 中即可。这将允许 JNI 类在 junit 测试中仍然工作(under ),这是一个安全的解决方法,因为它不太可能掩盖错误(如果实际需要本机库,其他内容肯定会失败)。从那里,你可以使用像 mockito 这样的东西来存根任何仍然命中 JNI 库的方法调用。src/test/...

例如在 Kotlin 中:

    companion object {
        init {
            try {
                System.loadLibrary("mylibrary")
            } catch (e: UnsatisfiedLinkError) {
                // log the error or track it in analytics
            }
        }
    }

推荐