J'essaie d'exécuter des tests d'instrumentation Kotlin pour Android.
Dans mon application/build.Gradle:
Android {
dataBinding {
enabled = true
}
compileSdkVersion 28
defaultConfig {
applicationId "com.myproject"
minSdkVersion 18
targetSdkVersion 28
versionCode 6
versionName "0.0.7"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
sourceSets {
main.Java.srcDirs += 'src/main/kotlin'
androidTest.Java.srcDirs += 'src/androidTest/kotlin'
}
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0-alpha02'
androidTestImplementation 'androidx.test.ext:junit:1.1.0'
androidTestImplementation 'androidx.test:rules:1.1.2-alpha02'
androidTestImplementation 'androidx.test:runner:1.1.2-alpha02'
Dans le dossier /app/src/androidTest/kotlin/com/myproject/
J'ai un test de kotlin:
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import org.junit.Rule
import org.junit.runner.RunWith
import androidx.test.rule.ActivityTestRule
import com.myproject.ui.activity.TradersActivity
import org.junit.Before
@RunWith(AndroidJUnit4::class)
@SmallTest
class TradersActivityTest {
private lateinit var stringToBetyped: String
@get:Rule
var activityRule: ActivityTestRule<TradersActivity> = ActivityTestRule(TradersActivity::class.Java)
@Before
fun initValidString() {
// Specify a valid string.
stringToBetyped = "Espresso"
}
}
mais quand je cours test, je reçois une erreur:
$ adb Shell am instrument -w -r -e debug false -e class 'com.myproject.TradersActivityTest' com.myproject.debug.test/androidx.test.runner.AndroidJUnitRunner
Client not ready yet..
Started running tests
Java.lang.RuntimeException: Delegate runner 'androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner' for AndroidJUnit4 could not be loaded.
at androidx.test.ext.junit.runners.AndroidJUnit4.throwInitializationError(AndroidJUnit4.Java:92)
at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.Java:82)
at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.Java:51)
at androidx.test.ext.junit.runners.AndroidJUnit4.<init>(AndroidJUnit4.Java:46)
at Java.lang.reflect.Constructor.newInstance(Native Method)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.Java:104)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.Java:86)
at androidx.test.internal.runner.junit4.AndroidAnnotatedBuilder.runnerForClass(AndroidAnnotatedBuilder.Java:63)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.Java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.Java:26)
at androidx.test.internal.runner.AndroidRunnerBuilder.runnerForClass(AndroidRunnerBuilder.Java:153)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.Java:59)
at androidx.test.internal.runner.TestLoader.doCreateRunner(TestLoader.Java:73)
at androidx.test.internal.runner.TestLoader.getRunnersFor(TestLoader.Java:104)
at androidx.test.internal.runner.TestRequestBuilder.build(TestRequestBuilder.Java:789)
at androidx.test.runner.AndroidJUnitRunner.buildRequest(AndroidJUnitRunner.Java:544)
at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.Java:387)
at Android.app.Instrumentation$InstrumentationThread.run(Instrumentation.Java:1879)
Caused by: Java.lang.reflect.InvocationTargetException
at Java.lang.reflect.Constructor.newInstance(Native Method)
at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.Java:72)
... 16 more
Caused by: org.junit.runners.model.InitializationError
at org.junit.runners.ParentRunner.validate(ParentRunner.Java:418)
at org.junit.runners.ParentRunner.<init>(ParentRunner.Java:84)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.Java:65)
at androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner.<init>(AndroidJUnit4ClassRunner.Java:43)
at androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner.<init>(AndroidJUnit4ClassRunner.Java:48)
... 18 more
Tests ran to completion.
Le message d'erreur affiché lorsque je supprime la méthode @Test.
Vous pouvez essayer de mettre une méthode @Test et de courir
@Test
public void signInTest() {
}
Je viens de perdre toute la journée sur cette question ????
Je suppose que vous utilisez le plug-in multiplateforme comme je suis.
J'étais sur le point d'essayer d'essayer de déplacer mes tests instrumentés à SRC/AndroidTest/Kotlin au lieu de SRC/AndroidTest/Java
quand j'ai décidé de connecter kotlin.sourcesets.Names, qui imprimait
[androidAndroidTest, androidAndroidTestDebug, androidDebug, androidMain, androidRelease, androidTest, androidTestDebug, androidTestRelease, commonMain, commonTest, iosArm32Main, iosArm32Test, iosArm64Main, iosArm64Test, iosX64Main, iosX64Test, macosX64Main, macosX64Test]
Soo j'ai réalisé pour que les dépendances résolvent correctement, je devais changer
androidTestImplementation -> androidAndroidTestImplementation
testImplementation -> androidTestImplementation
Ils ne décrivent pas cela dans la documentation bien sûr. (autant que j'ai trouvé)
... Donc, par exemple, pour vous, je pense que les dépendances de vos dépendances de test instrumenté devraient être:
androidAndroidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0-alpha02'
ne pas
androidTestimplementation 'androidx.test.espresso: espresso-noyau: 3.2.0-alpha02'
Dans mon cas lors de l'utilisation de Java, je suis confronté à une question lorsque j'ai fait des erreurs de dessous.
1) J'avais fait ActivitéTestrule comme privé.
All test cases should be public always.
2) Je n'ai pas ajouté statique pour Beforeclass et AfterClass Méthodes
Methods of @BeforeClass and @AfterClass should be static
Ex)@BeforeClass
public static void setUp(){
}
Vous n'avez aucune fonction annotée avec @Test
. Ceci est probablement la cause de la question. J'ai exécuté mon propre test en utilisant le coureur AndroidJunit4 sur une classe sans @Test
fonctions et reconstruit ce comportement.
Le coureur AndroidJunit4 Junit4 est la cause de ce problème et malgré sa tentative de fournir un message détaillé (voir le code où l'exception est lancée), cela vous donne un mauvais message.
Les suivants sont plus façons d'atteindre cette erreur:
@Test
fun willThrowInitializationErrorBecauseReturnsNonUnitValue(): Int {
return 0
}
@Test
fun willThrowInitializationErrorBecauseTakesParameters(param: Int) {
}
L'erreur est générée par le fait que vous écrivez des tests de style JUNIT4, et ils sont censés être conformes à la sémantique Junit4, mais ce serait bien si le message d'erreur était plus clair.
Pour aggraver les choses, si une fonction de test est gâchée, le coureur n'exécutera aucun test car le InitializationError
est lancé dans le constructeur de la classe AndroidJunit4.