android - Robolectric 和 AndroidX ClassNotFoundException android.support.v4.app.NotificationCompat$Style
问题描述
我正在尝试使用 Robolectric 在不使用模拟器或设备的情况下对 Android 应用程序中的某些类进行单元测试。例如,我想对 Dao 类进行单元测试,但我总是遇到以下异常:
引起:java.lang.ClassNotFoundException:android.support.v4.app.NotificationCompat$Style
这里是 fullstackstrace :
java.lang.NoClassDefFoundError: android/support/v4/app/NotificationCompat$Style at com.pcg.ape.AudiencePlus.a(Unknown Source) at com.pcg.ape.AudiencePlus.initialize(Unknown Source) at com.company。 app.AppApplication.onCreate(AppApplication.kt:360) 在 org.robolectric.android.internal.AndroidEnvironment.lambda$installAndCreateApplication$0(AndroidEnvironment.java:253) 在 org.robolectric.util.PerfStatsCollector.measure(PerfStatsCollector.java:75) ) 在 org.robolectric.android.internal.AndroidEnvironment.installAndCreateApplication(AndroidEnvironment.java:253) 在 org.robolectric.android.internal.AndroidEnvironment.setUpApplicationState(AndroidEnvironment.java:149) 在 org.robolectric.RobolectricTestRunner.beforeTest(RobolectricTestRunner. java:298) 在 org.robolectric.internal.SandboxTestRunner$2。lambda$evaluate$0(SandboxTestRunner.java:247) at org.robolectric.internal.bytecode.Sandbox.lambda$runOnMainThread$0(Sandbox.java:89) at java.util.concurrent.FutureTask.run(FutureTask.java:266)在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745 ) 引起:java.lang.ClassNotFoundException: android.support.v4.app.NotificationCompat$Style at org.robolectric.internal.bytecode.SandboxClassLoader.getByteCode(SandboxClassLoader.java:164) at org.robolectric.internal.bytecode.SandboxClassLoader .maybeInstrumentClass(SandboxClassLoader.java:119) 在 org.robolectric.internal.bytecode.SandboxClassLoader.lambda$findClass$0(SandboxClassLoader.java:112) 在 org.robolectric.util.PerfStatsCollector.measure(PerfStatsCollector.java:53) at org.robolectric.internal.bytecode.SandboxClassLoader.findClass(SandboxClassLoader.java:111) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at java .lang.ClassLoader.loadClass(ClassLoader.java:357) ... 16 更多
请注意,AudiencePlus 库是一个用于接收推送通知的库(如 OneSignal)。
该项目使用androidX。这里有一些配置元素:
该gradle.properties
文件包含以下几行:
android.enableJetifier=true
android.useAndroidX=true
android.enableUnitTestBinaryResources=true
app 模块的build.gradle
文件包含以下几行:
android
{
defaultConfig
{
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
testOptions
{
unitTests
{
includeAndroidResources = true
}
}
}
}
dependencies
{
testImplementation "junit:junit:4.12"
testImplementation "androidx.test:runner:1.1.1"
testImplementation "androidx.test.ext:junit-ktx:1.1.0"
testImplementation "org.robolectric:robolectric:4.2"
}
这是我要测试的课程:
package com.company.app.room.ecat.dao
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class MyDaoTest
{
@Test
fun myMethodTest()
{
}
}
请注意,我在“运行/调试配置”菜单中尝试了所有“缩短命令行”选项。
"none" 不能编译(参数太长),所有其他工作都与ClassNotFoundException
.
任何人都可以帮助我吗?为什么它会尝试加载非 androidx 类?
解决方案
推荐阅读
- c++ - 运行由 protoc 生成的文件时出现分段错误
- plugins - 在 Dynamics CRM 中的自定义按钮后面创建插件
- python - 根据条件选择 Pandas 数据框中的列
- mysql - 可以在查询中使用 IF 吗?
- c - 如何使用 ncurses 修复箭头键的延迟?
- python - 如何在 Python 中使用 OAuth 对 Wikimedia Commons 查询服务进行身份验证?
- java - 多个请求进入 Java gRPC Server 的同一个线程
- java - 如何将列表对象绑定到百里香形式?
- opencv - OpenCV cv::Mat to System::Drawing::Bitmap throw System.ArgumentException (OpenCV C++/CLI, x64)
- python - Python 在文件中搜索字符串时提高性能