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?
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.
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 AndroidJUnitRunner
versions/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