Я пытаюсь использовать 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?