web-dev-qa-db-fra.com

java.lang.IllegalStateException: Aucune instrumentation enregistrée! Doit fonctionner sous une instrumentation d'enregistrement

J'ai essayé de réaliser un test d'interface utilisateur simple avec Espresso et tous mes tests échouent avec la même exception:

Java.lang.IllegalStateException: Aucune instrumentation enregistrée! Doit fonctionner sous une instrumentation d'enregistrement

C’est un guide d’initiation à l’utilisation de esspresso ici . J'ai déjà trouvé des questions similaires, mais les questions les plus pertinentes pour moi sont sans réponse ici - Je suppose que c'est parce qu'elles n'ont pas peint l'ensemble de l'image, voici donc mon code. Je ne montrerai qu'un seul test car ils échouent tous avec exactement la même erreur: 

build.gradle (module: app)

apply plugin: 'com.Android.application'

Android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "io.github.vinge1718.myrestaurants"
        minSdkVersion 15
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
        //testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
    testOptions {
        unitTests {
            includeAndroidResources = true
        }
    }
}

dependencies {
    testImplementation "org.robolectric:robolectric:3.8"
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.Android.support:appcompat-v7:27.1.1'
    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', {
        exclude group: 'com.Android.support', module: 'support-annotations'
    })

    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
    androidTestImplementation 'androidx.test:runner:1.1.0'
    androidTestImplementation 'androidx.test:rules:1.1.0'
    androidTestImplementation 'org.hamcrest:hamcrest-library:1.3'
}

build.gradle (Projet: MonRestaurant)

buildscript {

    repositories {
        google()
        jcenter()
        maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
    }

    dependencies {
        classpath 'com.Android.tools.build:gradle:3.2.1'
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

correction voici les deux tests. Je ne pense pas que l'erreur soit liée aux tests eux-mêmes mais aux configurations - je reste corrigé si

(MainActivityInstrumentationTest.Java)

package io.github.vinge1718.myrestaurants;

import Android.support.test.runner.AndroidJUnit4;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import androidx.test.rule.ActivityTestRule;

import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.closeSoftKeyboard;
import static androidx.test.espresso.action.ViewActions.typeText;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;


@RunWith(AndroidJUnit4.class)
public class MainActivityInstrumentationTest {
    private String mStringToBetyped;

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

    @Before
    public void initValidString() {
        // Specify a valid string.
        mStringToBetyped = "Portland";
    }

    @Test
    public void validateEditText(){
        onView(withId(R.id.locationEditText))
                .perform(typeText(mStringToBetyped), closeSoftKeyboard())
                .check(matches(withText(mStringToBetyped)));
    }

    @Test
    public void locationIsSentToRestaurantActivity(){
        String location = "Portland";
        onView(withId(R.id.locationEditText)).perform(typeText(location));
        onView(withId(R.id.findRestaurantsButton)).perform(click());
        onView(withId(R.id.locationTextView)).check(matches(withText("Here are all the Restaurants near " + location)));
    }
}

J'ai essayé de suivre la documentation de configuration de cet espresso ici mais je continue à avoir la même erreur:

A commencé à exécuter des tests

Java.lang.IllegalStateException: Aucune instrumentation enregistrée! Doit courir sous une instrumentation d'enregistrement. à androidx.test.InstrumentationRegistry.getInstrumentation (InstrumentationRegistry.Java:50) à androidx.test.InstrumentationRegistry.getTargetContext (InstrumentationRegistry.Java:101) à androidx.test.rule.ActivityTestRule. (ActivityTestRule.Java:144) à androidx.test.rule.ActivityTestRule. (ActivityTestRule.Java:120) à androidx.test.rule.ActivityTestRule. (ActivityTestRule.Java:103) à io.github.vinge1718.myrestaurants.MainActivityInstrumentationTest. (MainActivityInstrumentationTest.Java:25) à Java.lang.reflect.Constructor.newInstance0 (Méthode native) à Java.lang.reflect.Constructor.newInstance (Constructor.Java:334) à org.junit.runners.BlockJUnit4ClassRunner.createTest (BlockJUnit4ClassRunner.Java:217) à org.junit.runners.BlockJUnit4ClassRunner $ 1.runReflectiveCall (BlockJUnit4ClassRunner.Java:266) à org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.Java:12) à org.junit.runners.BlockJUnit4ClassRunner.methodBlock (BlockJUnit4ClassRunner.Java:263) à org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.Java:78) à org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.Java:57) à org.junit.runners.ParentRunner $ 3.run (ParentRunner.Java:290) à org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.Java:71) à org.junit.runners.ParentRunner.runChildren (ParentRunner.Java:288) à l'adresse org.junit.runners.ParentRunner.access $ 000 (ParentRunner.Java:58) à l'adresse org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.Java:268) à l'adresse org.junit.runners.ParentRunner.run (ParentRunner.Java:363) à l'adresse Android.support.test.runner.AndroidJUnit4.run (AndroidJUnit4.Java:101) à org.junit.runners.Suite.runChild (Suite.Java:128) à org.junit.runners.Suite.runChild (Suite.Java:27) à l'adresse org.junit.runners.ParentRunner $ 3.run (ParentRunner.Java:290) à org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.Java:71) à org.junit.runners.ParentRunner.runChildren (ParentRunner.Java:288) à l'adresse org.junit.runners.ParentRunner.access $ 000 (ParentRunner.Java:58) à l'adresse org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.Java:268) à org.junit.runners.ParentRunner.run (ParentRunner.Java:363) à l'adresse org.junit.runner.JUnitCore.run (JUnitCore.Java:137) à l'adresse org.junit.runner.JUnitCore.run (JUnitCore.Java:115) à l'adresse Android.support.test.internal.runner.TestExecutor.execute (TestExecutor.Java:56) à Android.support.test.runner.AndroidJUnitRunner.onStart (AndroidJUnitRunner.Java:384) à Android.app.Instrumentation $ InstrumentationThread.run (Instrumentation.Java:2075)

Les tests ont été terminés.

Voici les configurations de test décrites dans la configuration de l’espresso documentation :

entrez la description de l'image ici

4
Victor Njonge

Je pense que cela est dû au fait que les bibliothèques androidx sont en conflit avec com.Android.support.test. Si vous souhaitez utiliser jetpack, vous devez convertir toutes les bibliothèques de test en androidx. Si vous ne le souhaitez pas, supprimez simplement vos bibliothèques androidx et utilisez tous les com.Android.support.test. Vérifier ma dernière réponse dans Tests d'instrumentation Android: Aucune instrumentation enregistrée Erreur . J'espère que cela vous aidera.

1
audrians

J'ai eu le même problème et il y a une différence entre un test qui exerce des méthodes dans les classes, ces unités standard tests go in app/src/test/Java/<package>. UI tests qui interagit avec les boutons, édite les textes, etc. nécessite un expresso et passe en app/src/androidTest/Java/<package>. Il m'a fallu plusieurs lectures de la documentation et j'ai perdu une journée avant de comprendre la distinction.

|____app
  |
  | ____src 
  |   |____androidTest
  |   |  |____Java
  |   |     |____<package>
  |   |        |____ MainActivityInstrumentationTest.Java  # expresso here 
  |   |____test
  |      |____Java
  |         |____<package>
  |            |____ MainActivityInstrumentationTest.Java  # not here
0
MikeF