首页 > 解决方案 > Android单元测试:java.lang.UnsatisfiedLinkError:否在 java.library.path 中

问题描述

我写此消息是因为我的 android 单元测试遇到问题,我需要您的帮助。

实际上,在我的 Android 应用程序中,我使用的是从 jar 文件导入的模块(对象):

api fileTree(dir: "libs", include: ["*.jar"])

实现文件树(包括:['*.so'],目录:'jniLibs')

import com.toto.library.myClass

然后我在一个方法中像这样使用它

 var myClass: MyClass = MyClass()
 myClass.doSomething()

在我的单元测试文件中,我试图模拟它:

@Mock
private var mockMyClass: myClass? = null

在尝试运行测试时,我总是收到此错误:

java.lang.UnsatisfiedLinkError: no <library-name> in java.library.path

我可以看到库中有一个文件正在尝试加载库,并且可能产生了此错误消息

static {
    try {
        System.loadLibrary("toto");
    } catch (NoClassDefFoundError var1) {
    }

}

但即使在搜索了许多其他线程并尝试了其他解决方案之后,我也不明白如何让我的 jar 文件可用于我的单元测试。

实际上我的单元测试文件在:/home/username/AndroidStudioProject/project-name/src/test/java/com/my/package

我的 jar 文件位于:/home/username/AndroidStudioProject/project-name/libs

链接到 jar 文件 (toto.jar) 的其他一些“.so”(例如 tata.so 文件)位于:/home/username/AndroidStudioProject/project-name/src/main/jniLibs

我的应用程序项目文件位于:/home/username/AndroidStudioProject/project-name/src/main/java

请问有什么方法可以在单元测试编译时知道 jar 库文件在 libs 文件夹中吗?我在 build.gradle 有什么要修改的吗?(比如 testOptions ?)

预先感谢您的帮助 !

标签: androidunit-testingkotlinjarmockito

解决方案


最后我找到了解决方案,我把它分享给你:

  1. 为了使测试像在真实设备上一样工作,您必须使用仪器测试(Android Runner)进行测试

  2. 您必须将所有测试文件放在 androidTest 目录中,否则您的仪器测试将无法工作

/home/username/AndroidStudioProject/project-name/src/androidTest
  1. 添加依赖,请检查是否需要更新版本号
androidTestImplementation 'junit:junit:4.13.1'
androidTestImplementation 'androidx.test:core:1.3.0'
androidTestImplementation 'org.mockito:mockito-core:3.6.0'
androidTestImplementation 'androidx.test:runner:1.3.0'
androidTestImplementation 'androidx.test:rules:1.3.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'org.mockito:mockito-android:3.6.0'
  1. 在上面添加测试类名称声明:
@RunWith(AndroidJUnit4::class)
  1. 在特定情况下:如果您想模拟从外部 .jar 库导入的对象(类)并且您有该库的外部 .so 文件,也许您必须检查是否有不同的 .so 文件用于不同的架构==>

例如,您的 jniLIbs 文件夹 /src/main/jniLibs/armeabi-v7a/.so 中有一些 .so 文件可能对于您的主应用程序 armeabi-v7a 就足够了,但是对于仪表化单元测试单元,您将需要其他架构,所以只需添加库提供者提供的所有文件夹和 .so 文件:除了 armeabi-v7a,您还将拥有:那些文件夹 armeabi、x86、x86_64 等。

然后你的测试将通过


推荐阅读