9
votes

I have been trying to perform a simple UI test using Espresso and all my tests fail with the same exception:

java.lang.IllegalStateException: No instrumentation registered! Must run under a registering instrumentation

It's a beginners guide in the use of esspresso here. I have already found similar questions but the most relevant ones to me are unanswered here - I presume it is because they didn't paint the whole picture so here is my code. I will only show one test because they all fail with the exact same error:

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 (Project: 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
}

correction here are the two tests. I don't think the error is in any way related to the tests themselves but the configurations - I stand corrected though

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

I have tried following this espresso set up documentation here but I keep getting the same error:

Started running tests

java.lang.IllegalStateException: No instrumentation registered! Must run under a registering instrumentation. at androidx.test.InstrumentationRegistry.getInstrumentation(InstrumentationRegistry.java:50) at androidx.test.InstrumentationRegistry.getTargetContext(InstrumentationRegistry.java:101) at androidx.test.rule.ActivityTestRule.(ActivityTestRule.java:144) at androidx.test.rule.ActivityTestRule.(ActivityTestRule.java:120) at androidx.test.rule.ActivityTestRule.(ActivityTestRule.java:103) at 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) at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:217) at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:266) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:263) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at android.support.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:101) at org.junit.runners.Suite.runChild(Suite.java:128) at org.junit.runners.Suite.runChild(Suite.java:27) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at org.junit.runner.JUnitCore.run(JUnitCore.java:115) at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:56) at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:384) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2075)

Tests ran to completion.

Here is my test configurations as decribed in the espresso set up documentation:

3
someone answered and resolved mine issue stackoverflow.com/a/53341010/10096288Rex Yu

3 Answers

4
votes

I think this is because of libraries androidx is conflicting with com.android.support.test. If you want to use jetpack, you must convert all of test library to androidx, if you don't want that way, just delete your androidx libraries and use all com.android.support.test. Check my latest answer in Android Instrumentation Testing: No instrumentation registered Error. Hope this help you.

1
votes

I had the same issue and there difference between a test which exercise methods in classes, those standard unit tests go in app/src/test/java/<package>. UI tests that interact with buttons, edit texts, etc require expresso and go in app/src/androidTest/java/<package>. It took me several reads of the documentation and I wasted a day before I figured out the distinction.

|____app
  |
  | ____src 
  |   |____androidTest
  |   |  |____java
  |   |     |____<package>
  |   |        |____ MainActivityInstrumentationTest.java  # expresso here 
  |   |____test
  |      |____java
  |         |____<package>
  |            |____ MainActivityInstrumentationTest.java  # not here
-2
votes

What worked for me is to completely change back from

androidX

to

com.android.support

libraries in the build.gradle

Please note: You might have to re import the libraries in your class e.g.

import androidx.test.runner.AndroidJUnitRunner;

to

import android.support.test.runner.AndroidJUnitRunner;

Also make sure you always clean and rebuilt the project after each addition or removal library from build.gradle.