web-dev-qa-db-fra.com

Vous avez tenté d'utiliser AndroidJUnit4 avec le coureur JUnit standard et le coureur délégué 'org.robolectric.RobolectricTestRunner'pourrait ne pas être chargé

J'utilise espresso pour exécuter des tests, mais je ne sais pas pourquoi le roboélectrique est inclus dans cette erreur car les tests sont uniquement pour l'espresso, voici l'erreur:

Java.lang.Exception: Attempted to use AndroidJUnit4 with standard JUnit runner and delegate runner 'org.robolectric.RobolectricTestRunner'could not be loaded. Check your build configuration.
at Android.support.test.runner.AndroidJUnit4.loadRunner(AndroidJUnit4.Java:89)
at Android.support.test.runner.AndroidJUnit4.loadRunner(AndroidJUnit4.Java:63)
at Android.support.test.runner.AndroidJUnit4.<init>(AndroidJUnit4.Java:57)
at Java.lang.reflect.Constructor.newInstance0(Native Method)
at Java.lang.reflect.Constructor.newInstance(Constructor.Java:343)
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:543)
at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.Java:386)
at Android.app.Instrumentation$InstrumentationThread.run(Instrumentation.Java:2145)

J'ai suivi la documentation pour expresso et je vois que tout va bien. Quel pourrait être le problème :

Voici mon fichier gradle:

apply plugin: 'com.Android.application'
apply plugin: 'jacoco'


jacoco {
    toolVersion = "0.7.6.201602180812"
}

tasks.withType(Test) {
    jacoco.includeNoLocationClasses = true
}

task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest', 'createDebugCoverageReport']) {

    reports {
        xml.enabled = true
        html.enabled = true
    }

    def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*', 'Android/**/*.*']
    def debugTree = fileTree(dir: "$project.buildDir/intermediates/classes/debug", excludes: fileFilter)
    def mainSrc = "$project.projectDir/src/main/Java"

    sourceDirectories = files([mainSrc])
    classDirectories = files([debugTree])
    executionData = fileTree(dir: project.buildDir, includes: [
            'jacoco/testDebugUnitTest.exec', 'outputs/code-coverage/connected/*coverage.ec'
    ])
}


Android {

    adbOptions {
        timeOutInMs 60 * 1000
    }

    compileSdkVersion 28
    defaultConfig {
        applicationId "com.levelapp.converge.convergelevelapp"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        debug {
            testCoverageEnabled true
        }

        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }

    testOptions {
        animationsDisabled true

        unitTests {
            includeAndroidResources = true
        }

        unitTests.all {
            jacoco {
                includeNoLocationClasses = true
            }
        }
    }
}


dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.Android.support:appcompat-v7:28.0.0'
    implementation 'com.Android.support:animated-vector-drawable:28.0.0'
    implementation 'com.Android.support:exifinterface:28.0.0'
    implementation 'com.Android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.Android.support.test:runner:1.0.2'
    androidTestImplementation 'com.Android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.Android.support:cardview-v7:28.0.0'
    implementation 'com.Android.support:recyclerview-v7:28.0.0'
    androidTestUtil 'com.Android.support.test:orchestrator:1.0.2-alpha1'
    testImplementation 'junit:junit:4.12'
    testImplementation 'org.robolectric:robolectric:3.7.1'
    implementation 'com.squareup.retrofit2:retrofit:2.5.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
    implementation 'com.koushikdutta.ion:ion:2.+'
    implementation 'com.mikhaellopez:circularimageview:3.2.0'
    implementation 'com.Android.support:multidex:1.0.3'


    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
    androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.1.0'
    androidTestImplementation 'androidx.test:runner:1.1.0'
    androidTestImplementation 'androidx.test:rules:1.1.0'


    androidTestImplementation('com.Android.support:multidex-instrumentation:1.0.1') {
        exclude group: 'com.Android.support', module: 'multidex'
    }

}

Ensuite, voici le test que je suis en train de faire:

@Rule
public ActivityTestRule<MainActivity> activity = new ActivityTestRule<>(MainActivity.class);

@Test
public void loadRecyclerview(){

    Espresso.onView(ViewMatchers.withId(R.id.rv)).
            perform(RecyclerViewActions.actionOnItemAtPosition(0, ViewActions.click()));

    Espresso.onView(withId(R.id.text))
            .check(matches(withText("k33too")))
            .check(matches(isDisplayed()));
}

Quel pourrait être le problème?

8
Idris Stack

Je vois que vous utilisez AndroidX. Assurez-vous que vous utilisez l'importation correcte. J'ai rencontré ce problème aujourd'hui et j'ai réalisé que j'utilisais toujours l'ancien import Android.support.test.runner.AndroidJUnit4; alors que j'aurais dû utiliser import androidx.test.runner.AndroidJUnit4;

Cela a corrigé l'erreur pour moi.

10
Zac

En plus de la réponse de Zac, j'ai dû utiliser la dépendance ci-dessous pour résoudre ce problème:

import androidx.test.ext.junit.runners.AndroidJUnit4

et dans le build.gradle de l'application assurez-vous que vous avez cette dépendance:

androidTestImplementation 'androidx.test.ext:junit:1.1.0'

et sous le Android.buildConfig, assurez-vous que vous avez:

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

5
ChrisBorg

J'ai ajouté la dépendance à mon fichier Gradle et il peut maintenant trouver Roboelectric

    testImplementation 'org.robolectric:robolectric:4.0'

J'espère que ça aide

3
Cesar

mise à jour pour kotlin. Assurez-vous que tous les @Rule les annotations sont sous forme de @get:Rule - c'était un problème dans mon cas.

2
Filipkowicz