web-dev-qa-db-ja.com

java.lang.IllegalStateException:インストルメンテーションが登録されていません!登録インストルメンテーションの下で実行する必要があります

Espressoを使用して簡単なUIテストを実行しようとしましたが、同じ例外を除いてすべてのテストが失敗します。

Java.lang.IllegalStateException:インストルメンテーションが登録されていません!登録インストルメンテーションの下で実行する必要があります

エスプレッソの使い方の初心者向けガイドです こちら 。私はすでに同様の質問を見つけましたが、私にとって最も関連性のある質問は答えられていません ここ -全体像を描いていないためだと思いますので、ここに私のコードがあります。すべてがまったく同じエラーで失敗するため、1つのテストのみを示します。

build.gradle(モジュール:アプリ)

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(プロジェクト: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
}

ここでの修正は、twoテストです。エラーはテスト自体に関連しているとは思いませんが、構成に関連していると思います-私は修正されたままです

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

私はこのエスプレッソセットアップのドキュメントに従ってみました ここ しかし私は同じエラーを受け取り続けます:

テストの実行を開始しました

Java.lang.IllegalStateException:インストルメンテーションが登録されていません!登録インストルメンテーションの下で実行する必要があります。 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 android .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) org.junit.rでunners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:78)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:57)at org.junit.runners.ParentRunner $ 3.run(ParentRunner.Java:290)atorg。 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) 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)atorg.junit.runners.ParentRunner。 orgでaccess $ 000(ParentRunner.Java:58)。 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( Android.app.Instrumentation $ InstrumentationThread.run(Instrumentation.Java:2075)のAndroidJUnitRunner.Java:384)

テストは完了するまで実行されました。

これがエスプレッソのセットアップで説明されている私のテスト構成です ドキュメント

ここに画像の説明を入力してください

6
Victor Njonge

これは、ライブラリandroidxcom.Android.support.testと競合しているためだと思います。 jetpackを使用する場合は、すべてのテストライブラリをandroidxに変換する必要があります。その方法が必要ない場合は、androidxライブラリを削除し、すべてのcom.Android.support.testを使用してください。 Android Instrumentation Testing:No Instrumentation Registered Error で私の最新の回答を確認してください。これがお役に立てば幸いです。

2
audrians

私のために働いたのは、完全に元に戻すことです

androidX

com.Android.support

build.gradleのライブラリ

注意:クラスにライブラリを再インポートする必要がある場合があります。

import androidx.test.runner.AndroidJUnitRunner;

import Android.support.test.runner.AndroidJUnitRunner;

また、build.gradleからライブラリを追加または削除するたびに、プロジェクトを常にクリーンアップして再ビルドするようにしてください。

0
testsingh

私は同じ問題を抱えていましたが、クラスでメソッドを実行するテストと、それらの標準ユニット tests go in app/src/test/Java/<package>。 UI tests ボタンを操作したり、テキストを編集したりするには、expressoが必要で、app/src/androidTest/Java/<package>。ドキュメントを何度か読む必要があり、その違いを理解する前に1日無駄になりました。

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