web-dev-qa-db-fra.com

Déléguer le coureur 'androidx.test.internal.runner.junit4.androidjunit4ClassRunner' pour AndroidJunit4 n'a pas pu être chargé

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.
16
a_subscriber

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


}
2
JackWu

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'

1
luca992

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

     }
0
Tarun A

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.

0
fsryan