AndroidX: Инструментарий не зарегистрирован! Должен работать под регистрирующим прибором
Я пытаюсь запустить локальный unit тест, который зависит от контекста, и следовал этому руководству: https://developer.android.com/training/testing/unit-testing/local-unit-tests#kotlin и я установил до моего проекта, как это (по этой ссылке: https://developer.android.com/training/testing/set-up-project):
build.gradle (приложение)
android {
compileSdkVersion 28
buildToolsVersion '27.0.3'
defaultConfig {
minSdkVersion 21
targetSdkVersion 27
versionCode 76
versionName "2.6.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
useLibrary 'android.test.runner'
useLibrary 'android.test.base'
useLibrary 'android.test.mock'
}
testOptions {
unitTests.returnDefaultValues = true
unitTests.all {
// All the usual Gradle options.
testLogging {
events "passed", "skipped", "failed", "standardOut", "standardError"
outputs.upToDateWhen { false }
showStandardStreams = true
}
}
unitTests.includeAndroidResources = true
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
androidTestImplementation("androidx.test.espresso:espresso-core:$espressoVersion", {
exclude group: 'com.android.support', module: 'support-annotations'
})
// Espresso UI Testing dependencies
implementation "androidx.test.espresso:espresso-idling-resource:$espressoVersion"
androidTestImplementation "androidx.test.espresso:espresso-contrib:$espressoVersion"
androidTestImplementation "androidx.test.espresso:espresso-intents:$espressoVersion"
testImplementation 'androidx.test:core:1.0.0'
// AndroidJUnitRunner and JUnit Rules
androidTestImplementation 'androidx.test:runner:1.1.0'
androidTestImplementation 'androidx.test:rules:1.1.0'
// Espresso Assertions
androidTestImplementation 'androidx.test.ext:junit:1.0.0'
androidTestImplementation 'androidx.test.ext:truth:1.0.0'
androidTestImplementation 'com.google.truth:truth:0.42'
implementation 'androidx.multidex:multidex:2.0.0'
}
Моя версия эспрессо - espressoVersion = '3.1.0'
Мой тест, который находится в имени модуля /src/test/java/, выглядит следующим образом:
import android.content.Context
import androidx.test.core.app.ApplicationProvider
import com.instacart.library.truetime.TrueTime
import edu.mira.aula.shared.extensions.android.trueDateNow
import edu.mira.aula.shared.network.ConnectivityHelper
import kotlinx.coroutines.experimental.runBlocking
import org.junit.Assert
import org.junit.Before
import org.junit.Test
import java.util.*
import java.util.concurrent.CountDownLatch
class TimeExtensionsUnitTest {
private lateinit var instrumentationCtx: Context
@Before
fun setup() {
instrumentationCtx = ApplicationProvider.getApplicationContext<Context>()
}
@Test
fun testTrueTimeValueReturnsIfInitialized() {
if (ConnectivityHelper.isOnline(instrumentationCtx)) {
runBlocking {
val countDownLatch = CountDownLatch(1)
TrueTime.build()
.withSharedPreferencesCache(instrumentationCtx)
.withConnectionTimeout(10000)
.initialize()
countDownLatch.countDown()
try {
countDownLatch.await()
val dateFromTrueTime = trueDateNow()
val normalDate = Date()
Assert.assertNotEquals(dateFromTrueTime, normalDate)
} catch (e: InterruptedException) {
}
}
}
}
Каждый раз, когда я запускаю его, он дает мне:
java.lang.IllegalStateException: No instrumentation registered! Must run under a registering instrumentation.
at androidx.test.platform.app.InstrumentationRegistry.getInstrumentation(InstrumentationRegistry.java:45)
at androidx.test.core.app.ApplicationProvider.getApplicationContext(ApplicationProvider.java:41)
Если я запускаю его как инструментальный тест (меняя пакет), он запускается без ошибок. Но я подумал, что это руководство предназначено для запуска модульного тестирования с использованием классов Android Framework, таких как Context. Я даже попытался запустить этот class UnitTestSample
но возникает та же ошибка.
Я также удалил все зависимости android.support из моего проекта
Есть идеи, как это решить?
Ответы
Ответ 1
Обновление
Вы больше не должны сталкиваться с этой ошибкой, если используете последнюю версию Gradle.
Я также столкнулся с этой проблемой.
Если вы посмотрите на переход на Robolectric 4.0 здесь, он предлагает добавить следующую строку в gradle.properties
.
android.enableUnitTestBinaryResources=true
Проблема в том, что, если вы добавите это в gradle.properties
, он выдаст следующее предупреждение:
ВНИМАНИЕ: настройка параметра 'android.enableUnitTestBinaryResources = true' является экспериментальным и неподдерживаемый.
Теперь, если вы посмотрите на релизы Robolectric здесь. Вы могли заметить, что это известная проблема, в которой говорится, что
Плагин Android Gradle может выдать следующее предупреждение, которое может быть безопасно проигнорировано: ПРЕДУПРЕЖДЕНИЕ. Настройка параметра 'android.enableUnitTestBinaryResources = true' является экспериментальной и не поддерживается. Плагин Android Gradle 3.4 решит эту проблему.
Я верю, если вы не сможете обновить свой gradle до 3.4. Вы не сможете решить эту проблему.
Вместо этого я включил Robolectric 4.0 в качестве зависимости.
testImplementation "org.robolectric:robolectric:4.0.2"
и аннотируйте мой тестовый класс с помощью
@RunWith(RobolectricTestRunner::class)
Это должно заставить ваш тест работать.
Теперь, когда вы запустите тестирование, вы заметите, что Robolectric будет регистрировать следующее:
[Robolectric] NOTICE: legacy resources mode is deprecated; see
http://robolectric.org/migrating/#migrating-to-40
Пока игнорируйте это, но как только вы сможете обновить свой Gradle, перейдите на новое испытание Robolectric.
Ответ 2
У меня была похожая ошибка, и я изо всех сил пытался ее исправить. Моя проблема заключалась в том, что я AndroidJUnitRunner
версии/пакеты AndroidJUnit4
, InstrumentationRegistry
, ApplicationProvider
и AndroidJUnitRunner
. Убедитесь, что они все одного поколения. Вот классы, которые заставили все это работать для меня:
-
androidx.test.runner.AndroidJUnitRunner
-
androidx.test.platform.app.InstrumentationRegistry
-
androidx.test.ext.junit.runners.AndroidJUnit4
-
androidx.test.core.app.ApplicationProvider
для этого мне нужно было следующее в части dependencies
моего build.gradle
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
androidTestImplementation 'androidx.test:core:1.1.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.0'
androidTestImplementation "com.android.support:support-annotations:27.1.1"
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test:rules:1.0.2'
И конечно правильный
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
в моем defaultConfig
build.gradle
Ответ 3
Просто проверьте раздел импорта:
import androidx.test.runner.AndroidJUnit4;