AndroidX: Инструментарий не зарегистрирован!Должен работать под регистрирующим прибором - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь запустить локальный модульный тест, который зависит от контекста, и следовал этому руководству: 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'
}

Мой espresso_version 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 из моего проекта

Есть идеи, как ее решить?

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

У меня была похожая ошибка, и я изо всех сил пытался ее исправить.Моя проблема заключалась в том, что я смешивал версии / пакеты 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

0 голосов
/ 27 марта 2019

Просто проверьте раздел импорта:

import androidx.test.runner.AndroidJUnit4;
0 голосов
/ 10 декабря 2018

Обновление

Эта ошибка больше не возникает, если вы используете последнюю версию 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] ВНИМАНИЕ: устаревшие ресурсырежим устарел;см. http://robolectric.org/migrating/#migrating-to-40

Пока игнорируйте это, но как только вы сможете обновить свой Gradle, перейдите на новое испытание Robolectric.

...