web-dev-qa-db-fra.com

AndroidX: Aucune instrumentation enregistrée! Doit fonctionner sous une instrumentation d'enregistrement

J'essaie d'exécuter un test unitaire local qui dépend du contexte et suivais ce guide: https://developer.Android.com/training/testing/unit-testing/local-unit-tests# kotlin et j'ai mis en place mon projet comme suit (en suivant ce lien: https://developer.Android.com/training/testing/set-up-project ):

build.gradle (app)

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'
}

Mon espresso_version est espressoVersion = '3.1.0'

Mon test qui se trouve dans nom-module/src/test/Java / ressemble à ceci:

    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) {
            }
        }
    }
}

A chaque fois que je le lance, ça me donne:

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)

Si je le lance en tant que test instrumental (en changeant le paquet), il s’exécute sans erreur. Mais j’ai pensé que ce guide devait permettre d’exécuter des tests unitaires avec Android Les classes de structure telles que Context. J’ai même essayé d’exécuter le class UnitTestSample Mais la même erreur se produit.

J'ai également supprimé toutes les dépendances Android.support de mon projet

Des idées sur la façon de le résoudre?

22
julioribeiro

Mettre à jour

Vous ne devriez plus rencontrer cette erreur si vous utilisez la dernière version de Gradle.


J'ai aussi rencontré ce problème.

Si vous envisagez de migrer vers Robolectric 4.0 here , il est suggéré d’ajouter la ligne suivante à votre gradle.properties.

Android.enableUnitTestBinaryResources=true

Le problème est que, si vous ajoutez ceci, vous êtes votre gradle.properties, il émettra cet avertissement:

AVERTISSEMENT: le paramètre d'option 'Android.enableUnitTestBinaryResources = true' est expérimental et non pris en charge.

Maintenant, si vous regardez les versions de Robolectric ici . Vous pouvez voir qu'il s'agit d'un problème connu dans lequel ils déclarent que

Android Gradle Plugin peut signaler l'avertissement suivant, qui peut être ignoré sans risque: AVERTISSEMENT: le paramètre d'option 'Android.enableUnitTinaryBinaryResources = true' est expérimental et n'est pas pris en charge. Android Gradle Plugin 3.4 résoudra ce problème. .

Je crois que si vous ne pouvez pas mettre à jour votre version 3.4. Vous ne pourrez pas résoudre ce problème.

Ce que j'ai fait à la place, c'est d'inclure Robolectric 4.0 en tant que dépendance.

testImplementation "org.robolectric:robolectric:4.0.2"

et annoter ma classe de test avec

@RunWith(RobolectricTestRunner::class)

Cela devrait rendre votre test de travail.

Maintenant, lorsque vous exécuterez le test, vous remarquerez que Robolectric enregistre les informations suivantes:

[Robolectric] AVIS: le mode ressources héritées est obsolète; voir http://robolectric.org/migrating/#migrating-to-4

Ignorez cela pour l'instant, mais dès que vous pourrez mettre à jour votre diplôme, migrez vers le nouveau test Robolectric.

10
Archie G. Quiñones

J'ai eu une erreur similaire et luttais beaucoup pour la réparer. Mon problème était que je mélangeais AndroidJUnit4, InstrumentationRegistry, ApplicationProvider et AndroidJUnitRunnerversions/packages. Assurez-vous qu'ils sont tous de la même génération. Ce sont les classes qui ont tout fait fonctionner pour moi:

  • androidx.test.runner.AndroidJUnitRunner
  • androidx.test.platform.app.InstrumentationRegistry
  • androidx.test.ext.junit.runners.AndroidJUnit4
  • androidx.test.core.app.ApplicationProvider

pour cela, j'avais besoin de ce qui suit dans la partie dependencies de mon 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'

Et bien sûr le bon

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

dans mon defaultConfig du build.gradle

2
Boris Strandjev