webentwicklung-frage-antwort-db.com.de

java.lang.IllegalStateException: Keine Instrumentierung registriert! Muss unter einem registrierenden Instrument laufen

Ich habe versucht, einen einfachen UI-Test mit Espresso durchzuführen, und alle meine Tests schlagen mit der gleichen Ausnahme fehl:

Java.lang.IllegalStateException: Keine Instrumentierung registriert! Muss unter einem registrierenden Instrument laufen

Es ist eine Anleitung für Anfänger in der Verwendung von Esspresso here . Ich habe bereits ähnliche Fragen gefunden, aber die relevantesten für mich sind unbeantwortet hier - Ich nehme an, es liegt daran, dass sie nicht das ganze Bild malen. Hier ist also mein Code. Ich werde nur einen Test zeigen, da alle mit dem gleichen Fehler fehlschlagen: 

build.gradle (Modul: 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 (Projekt: MyRestaurant)

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
}

korrektur hier sind die zwei -Tests. Ich denke nicht, dass der Fehler in irgendeiner Weise mit den Tests selbst zusammenhängt, sondern mit den Konfigurationen

(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)));
    }
}

Ich habe versucht, dieser Espresso-Einrichtungsdokumentation here zu folgen, aber ich erhalte den gleichen Fehler:

Tests wurden gestartet

Java.lang.IllegalStateException: Keine Instrumentierung registriert! Muss laufen unter einer registrierenden instrumentierung. beim androidx.test.InstrumentationRegistry.getInstrumentation (InstrumentationRegistry.Java:50) beim androidx.test.InstrumentationRegistry.getTargetContext (InstrumentationRegistry.Java:101) beim androidx.test.rule.ActivityTestRule. (ActivityTestRule.Java:144) beim androidx.test.rule.ActivityTestRule. (ActivityTestRule.Java: 120) beim androidx.test.rule.ActivityTestRule. (ActivityTestRule.Java:103) beim io.github.vinge1718.myrestaurants.MainActivityInstrumentationTest. (MainActivityInstrumentationTest.Java:25) at Java.lang.reflect.Constructor.newInstance0 (Native Method) at Java.lang.reflect.Constructor.newInstance (Constructor.Java:334) um org.junit.runners.BlockJUnit4ClassRunner.createTest (BlockJUnit4ClassRunner.Java:217) beim org.junit.runners.BlockJUnit4ClassRunner $ 1.runReflectiveCall (BlockJUnit4ClassRunner.Java:266) beim org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.Java:12) beim org.junit.runners.BlockJUnit4ClassRunner.methodBlock (BlockJUnit4ClassRunner.Java:263) beim org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.Java:78) beim org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.Java:57) bei org.junit.runners.ParentRunner $ 3.run (ParentRunner.Java:290) um org.junit.runners.ParentRunner $ 1.schar (ParentRunner.Java:71) um org.junit.runners.ParentRunner.runChildren (ParentRunner.Java:288) um ​​ org.junit.runners.ParentRunner.access $ 000 (ParentRunner.Java:58) um ​​ org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.Java:268) um ​​ org.junit.runners.ParentRunner.run (ParentRunner.Java:363) um Android.support.test.runner.AndroidJUnit4.run (AndroidJUnit4.Java:101) at org.junit.runners.Suite.runChild (Suite.Java:128) um ​​ org.junit.runners.Suite.runChild (Suite.Java:27) um org.junit.runners.ParentRunner $ 3.run (ParentRunner.Java:290) um org.junit.runners.ParentRunner $ 1.schar (ParentRunner.Java:71) um org.junit.runners.ParentRunner.runChildren (ParentRunner.Java:288) um ​​ org.junit.runners.ParentRunner.access $ 000 (ParentRunner.Java:58) um ​​ org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.Java:268) um ​​ org.junit.runners.ParentRunner.run (ParentRunner.Java:363) um org.junit.runner.JUnitCore.run (JUnitCore.Java:137) um org.junit.runner.JUnitCore.run (JUnitCore.Java:115) um Android.support.test.internal.runner.TestExecutor.execute (TestExecutor.Java:56) beim Android.support.test.runner.AndroidJUnitRunner.onStart (AndroidJUnitRunner.Java:384) beim Android.app.Instrumentation $ InstrumentationThread.run (Instrumentation.Java:2075)

Die Tests wurden vollständig ausgeführt.

Hier sind meine Test-Konfigurationen wie im Espresso-Setup beschrieben Dokumentation :

Bildbeschreibung hier eingeben

4
Victor Njonge

Ich denke, das liegt an Bibliotheken, androidx steht im Konflikt mit com.Android.support.test. Wenn Sie jetpack verwenden möchten, müssen Sie die gesamte Testbibliothek in androidx konvertieren. Wenn Sie dies nicht möchten, löschen Sie einfach Ihre androidx-Bibliotheken und verwenden Sie alle com.Android.support.test. Überprüfen Sie meine neueste Antwort in Android Instrumentation Testing: Keine Instrumentierung registriert Fehler . Hoffe das hilft dir.

1
audrians

Ich hatte das gleiche Problem und es gab einen Unterschied zwischen einem Test, welche Übungsmethoden in Klassen, diesen Standardeinheiten Tests in app/src/test/Java/<package> gehen. UI Tests die mit Schaltflächen interagieren, Texte bearbeiten usw. erfordern einen Expresso und gehen in app/src/androidTest/Java/<package>. Es dauerte mehrere Lektüre der Dokumentation und ich verschwendete einen Tag, bevor ich den Unterschied herausfand.

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