我正在尝试使用Robolectric,以便在不使用模拟器或设备的情况下对Android应用程序中的某些类进行单元测试。例如,我想对Dao类进行单元测试,但是我总是有以下异常:
原因:java.lang.ClassNotFoundException:android.support.v4.app.NotificationCompat $ Style
这是fullstackstrace:
java.lang.NoClassDefFoundError: android / support / v4 / app / NotificationCompat $ Style位于 com.pcg.ape.AudiencePlus.a(来源未知) com.pcg.ape.AudiencePlus.initialize(未知来源)位于 com.hager.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) 在 org.robolectric.internal.bytecode.Sandbox.lambda $ runOnMainThread $ 0(Sandbox.java:89) 在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在 org.robolectric.internal.bytecode.SandboxClassLoader.getByteCode(SandboxClassLoader.java:164) 在 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) 在 org.robolectric.internal.bytecode.SandboxClassLoader.findClass(SandboxClassLoader.java:111) 在java.lang.ClassLoader.loadClass(ClassLoader.java:424)在 java.lang.ClassLoader.loadClass(ClassLoader.java:357)...还有16个
请注意,AudiencePlus库是为了接收推送通知(如OneSignal)的库。
该项目使用androidX。这里是一些配置元素:
gradle.properties
文件包含以下几行:
android.enableJetifier=true
android.useAndroidX=true
android.enableUnitTestBinaryResources=true
应用程序模块的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.hager.ecat.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()
{
}
}
请注意,我尝试在“运行/调试配置”菜单中尝试所有“ Shorten命令行”选项。
“无”参数不会编译(参数太长),而其他所有参数都将与ClassNotFoundException
一起使用。
有人可以帮助我吗?为什么它会尝试加载非androidx类?