mockito Android Unit test:java.lang.UnsatisfiedLinkError:no < library-name>in java.library.path

yqyhoc1h  于 2024-01-07  发布在  Android
关注(0)|答案(2)|浏览(156)

我写这条消息,因为我面临着我的android单元测试的问题,我需要你的帮助,请。
实际上,在我的Android应用程序中,我使用了一个从jar文件导入的模块(对象):

  • 我在我的/project/libs中有一个toto.jar(例如/project/libs/toto. jar)
  • 在我的build.gradle中,我有这两行代码来导入jar文件:

API fileTree(dir:“libs”,include:["*.jar”])
实现fileTree(包括:文件“*. so”],目录:“jniLibs”)

  • 在我的MainActivityHelper中,我将库的类导入到:
  1. import com.toto.library.myClass

字符串
然后我在一个方法中这样使用它

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


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

  1. @Mock
  2. private var mockMyClass: myClass? = null


当我尝试运行我的测试时,我总是得到这个错误:

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


我可以看到库中有一个试图加载库的文件,可能它产生了此错误消息

  1. static {
  2. try {
  3. System.loadLibrary("toto");
  4. } catch (NoClassDefFoundError var1) {
  5. }
  6. }


但即使在搜索了许多其他线程,并尝试了其他解决方案后,我不明白如何使我的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?)
提前感谢您的帮助!

cpjpxq1n

cpjpxq1n1#

Original Post Here
更新robolectric工程为我:

  1. testImplementation "org.robolectric:robolectric:4.9"

字符串
还有:

  1. testOptions { unitTests.includeAndroidResources = true }

zwghvu4y

zwghvu4y2#

最后我找到了解决方案,分享给大家:
1.为了让测试像在真实的设备上一样工作,您必须使用instrumented test(Android Runner)进行测试
1.你必须把所有的测试文件放在androidTest目录下,否则你的仪器测试将无法工作

  1. /home/username/AndroidStudioProject/project-name/src/androidTest

字符串
1.添加依赖项,请检查是否需要更新版本号

  1. androidTestImplementation 'junit:junit:4.13.1'
  2. androidTestImplementation 'androidx.test:core:1.3.0'
  3. androidTestImplementation 'org.mockito:mockito-core:3.6.0'
  4. androidTestImplementation 'androidx.test:runner:1.3.0'
  5. androidTestImplementation 'androidx.test:rules:1.3.0'
  6. androidTestImplementation 'androidx.test.ext:junit:1.1.2'
  7. androidTestImplementation 'org.mockito:mockito-android:3.6.0'


1.在上面添加测试类名声明:

  1. @RunWith(AndroidJUnit4::class)


1.在特殊情况下:如果你想模拟一个从外部.jar库导入的对象(类),并且你有该库的外部.so文件,也许你必须检查是否有不同的.so文件用于不同的体系结构==>
例如,你有一些.so文件在你的jniLIbs文件夹/src/main/jniLibs/armeabi-v7 a/.so也许对于你的主应用程序armeabi-v7 a就足够了,但是对于instrumented单元测试单元,你需要其他的架构,所以只需要添加库提供商提供的所有文件夹和.so文件:在加上armeabi-v7 a中,你还将有:那些文件夹armeabi,x86,x86_64等。
那你的测试就通过了

展开查看全部

相关问题