首页 > 解决方案 > 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 类?

标签: androidjunitclassnotfoundexceptionrobolectric

解决方案


推荐阅读