我写此消息是因为我的 Android 单元测试遇到问题,需要您的帮助。
实际上,在我的 Android 应用程序中,我使用的是从 jar 文件导入的模块(对象):
api fileTree(dir: "libs", include: ["*.jar"])
实现fileTree(include: ['*.so'], dir: '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/用户名/AndroidStudioProject/项目名称/src/test/java/com/my/package
我的 jar 文件位于: /home/用户名/AndroidStudioProject/项目名称/libs
链接到 jar 文件 (toto.jar) 的其他一些“.so”(例如 tata.so 文件)位于: /home/用户名/AndroidStudioProject/项目名称/src/main/jniLibs
我的应用程序项目文件位于: /home/用户名/AndroidStudioProject/项目名称/src/main/java
请问有什么方法可以让它在单元测试编译时知道 jar 库文件位于 libs 文件夹中吗?我在 build.gradle 中有什么需要修改的吗? (比如测试选项?)
提前感谢您的帮助!
终于找到解决方案了,分享给大家:
为了使测试像在真实设备上一样工作,您必须使用仪器测试(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'
@RunWith(AndroidJUnit4::class)
例如,您的 jniLIbs 文件夹中有一些 .so 文件 /src/main/jniLibs/armeabi-v7a/.so 也许对于您的主应用程序armeabi-v7a就足够了,但是对于仪表单元测试单元,您将需要其他架构,因此只需添加库提供商提供的所有文件夹和.so文件:在armeabi-v7a的基础上,您还将拥有:那些文件夹armeabi、x86、x86_64等
那么你的测试就会通过
为我更新 robolectric 作品:
testImplementation "org.robolectric:robolectric:4.9"
并且:
testOptions { unitTests.includeAndroidResources = true }