Android Unit test : java.lang.UnsatisfiedLinkError: no <library-name> in java.library.path
Android Unit test : java.lang.UnsatisfiedLinkError: no <library-name> in java.library.path
我写这封邮件是因为我的 android 单元测试遇到了问题,我需要你的帮助。
实际上,在我的 Android 应用程序中,我使用的是从 jar 文件导入的模块(对象):
- 我的/project/libs中有一个toto.jar(例如/project/libs/toto.jar)
- 在我的 build.gradle 中,我有这两行是为了导入 jar 文件:
api fileTree(dir: "libs", include: ["*.jar"])
implementation fileTree(include: ['*.so'], dir: 'jniLibs')
- 在我的 MainActivityHelper 中,我导入了库 toto 的 class :
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
其他一些“.so”(例如 tata.so 文件),链接到 jar 文件 (toto.jar),位于:
/home/username/AndroidStudioProject/project-name/src/main/jniLibs
我的应用项目文件位于:
/home/username/AndroidStudioProject/project-name/src/main/java
请问在单元测试编译时有什么方法可以让它知道 jar 库文件在 libs 文件夹中?我在 build.gradle 中有什么要修改的吗? (比如 testOptions ?)
预先感谢您的帮助!
终于找到了解决方法,分享给大家:
为了让测试像在真实设备上一样工作,您必须使用仪器测试(Android Runner)
您必须将所有测试文件放在 androidTest 目录中,否则您的仪器测试将无法运行
/home/username/AndroidStudioProject/project-name/src/androidTest
- 添加依赖,请检查是否需要更新版本号
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'
- 在上面添加你测试的 class 名称声明:
@RunWith(AndroidJUnit4::class)
- 在特定情况下:如果您想模拟从外部 .jar 库导入的对象 (class),并且您有该库的外部 .so 文件,也许您需要检查是否对于不同的体系结构,你有不同的 .so 文件 ==>
例如,您的 jniLIbs 文件夹中有一些 .so 文件
/src/main/jniLibs/armeabi-v7a/.所以
也许对于您的主应用程序 armeabi-v7a 就足够了,但是对于集成单元测试单元,您将需要其他体系结构,因此只需添加库提供者提供的所有文件夹和 .so 文件:在 armeabi-v7a 之外,您还将拥有: armeabi、x86、x86_64 等文件夹
那么你的测试就会通过
我写这封邮件是因为我的 android 单元测试遇到了问题,我需要你的帮助。
实际上,在我的 Android 应用程序中,我使用的是从 jar 文件导入的模块(对象):
- 我的/project/libs中有一个toto.jar(例如/project/libs/toto.jar)
- 在我的 build.gradle 中,我有这两行是为了导入 jar 文件:
api fileTree(dir: "libs", include: ["*.jar"])
implementation fileTree(include: ['*.so'], dir: 'jniLibs')
- 在我的 MainActivityHelper 中,我导入了库 toto 的 class :
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
其他一些“.so”(例如 tata.so 文件),链接到 jar 文件 (toto.jar),位于: /home/username/AndroidStudioProject/project-name/src/main/jniLibs
我的应用项目文件位于: /home/username/AndroidStudioProject/project-name/src/main/java
请问在单元测试编译时有什么方法可以让它知道 jar 库文件在 libs 文件夹中?我在 build.gradle 中有什么要修改的吗? (比如 testOptions ?)
预先感谢您的帮助!
终于找到了解决方法,分享给大家:
为了让测试像在真实设备上一样工作,您必须使用仪器测试(Android Runner)
您必须将所有测试文件放在 androidTest 目录中,否则您的仪器测试将无法运行
/home/username/AndroidStudioProject/project-name/src/androidTest
- 添加依赖,请检查是否需要更新版本号
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'
- 在上面添加你测试的 class 名称声明:
@RunWith(AndroidJUnit4::class)
- 在特定情况下:如果您想模拟从外部 .jar 库导入的对象 (class),并且您有该库的外部 .so 文件,也许您需要检查是否对于不同的体系结构,你有不同的 .so 文件 ==>
例如,您的 jniLIbs 文件夹中有一些 .so 文件 /src/main/jniLibs/armeabi-v7a/.所以 也许对于您的主应用程序 armeabi-v7a 就足够了,但是对于集成单元测试单元,您将需要其他体系结构,因此只需添加库提供者提供的所有文件夹和 .so 文件:在 armeabi-v7a 之外,您还将拥有: armeabi、x86、x86_64 等文件夹
那么你的测试就会通过