Robolectric和AndroidX ClassNotFoundException android.support.v4.app.NotificationCompat $ Style

时间:2019-04-09 10:13:49

标签: android junit classnotfoundexception robolectric

我正在尝试使用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类?

0 个答案:

没有答案