Robolectric и AndroidX ClassNotFoundException android.support.v4.app.NotificationCompat $ Style - PullRequest
3 голосов
/ 09 апреля 2019

Я пытаюсь использовать Robolectric для модульного тестирования некоторых классов в приложении Android без использования эмулятора или устройства. Я хотел бы, например, провести модульное тестирование класса Дао, но у меня всегда есть следующее исключение:

Вызвано: java.lang.ClassNotFoundException: android.support.v4.app.NotificationCompat $ Style

Вот полная трасса:

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 $ оценки $ 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) at 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 - это библиотека для получения push-уведомлений (например, 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()
  {

  }

}

Обратите внимание, что я пробую все параметры «Сократить командную строку» в меню «Запуск / отладка конфигураций».

"none" не компилируется (слишком длинные аргументы), а все остальные работают с ClassNotFoundException.

Кто-нибудь может мне помочь? Почему он пытается загрузить класс, отличный от androidx?

...