java.lang.IllegalStateException: нет зарегистрированных инструментов! Должен работать под регистрирующим прибором - PullRequest
0 голосов
/ 27 октября 2018

Я пытался выполнить простой тест пользовательского интерфейса с помощью Espresso, и все мои тесты не выполнялись с одним и тем же исключением:

java.lang.IllegalStateException: инструментарий не зарегистрирован!Должен работать под регистрационным инструментарием

Это руководство для начинающих по использованию эспрессо здесь .Я уже нашел подобные вопросы, но самые важные для меня остаются без ответа здесь - я предполагаю, что это потому, что они не нарисовали всю картину, так что вот мой код.Я покажу только один тест, потому что все они терпят неудачу с точно такой же ошибкой:

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
}

Коррекция здесь - это два теста.Я не думаю, что ошибка каким-либо образом связана с самими тестами, но с конфигурациями - я исправляюсь, хотя

(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: Нет инструментариязарегистрировано!Должен работать под регистрирующим прибором.на androidx.test.InstrumentationRegistry.getInstrumentation (InstrumentationRegistry.java:50) на androidx.test.InstrumentationRegistry.getTargetContext (InstrumentationRegistry.java:101) на androidx.test.rule.ActivityTestRule. (ActivityTestRule.java:144 at).rule.ActivityTestRule. (ActivityTestRule.java:120) на androidx.test.rule.ActivityTestRule. (ActivityTestRule.java:103) на io.github.vinge1718.myrestaurants.MainActivityInstrumentationTest. (MainActivityInstrumentationTest..reflect.Constructor.newInstance0 (Родной метод) при java.lang.reflect.Constructor.newInstance (Constructor.java:334) при org.junit.runners.BlockJUnit4ClassRunner.createTest (BlockJUnit4ClassRunner.java:217) в org.junit.runners.BlockJUnit4ClassRunner $ 1на org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:78) в org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:57) в org.junit.unv.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:71) в org.junit.runners.ParentRunner.runChildren (ParentRunner.java:288) в org.junit.runners.ParentRunner.access $ 000 (ParentRunner.j)в org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.java:268) в org.junit.runners.ParentRunner.run (ParentRunner.java:363) в android.support.test.runner.AndroidJUnit4.rit4 для AndroidJ.Java: 101) в org.junit.runners.Suite.runChild (Suite.java:128) в org.junit.runners.Suite.runChild (Suite.java:27) в 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) в org.junit.Runner.Parent.получить доступ к $ 000 (ParentRunner.java:58) в орг.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.java:268) в org.junit.runners.ParentRunner.run (ParentRunner.java:363) в org.junit.runner.JUnitCore.run (JUnitCore.java:7: 13)org.junit.runner.JUnitCore.run (JUnitCore.java:115) в android.support.test.internal.runner.TestExecutor.execute (TestExecutor.java:56) в android.support.test.runner.AndroidJUnitRunner.onAndroidJUnitRunner.java:384) в android.app.Инструментация $ InstrumentationThread.run (Instrumentation.java:2075)

Тесты завершены.

Вот мои тестовые конфигурации, описанные в настройках эспрессо документация :

введите описание изображения здесь

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

Я думаю, это из-за библиотек androidx конфликтует с com.android.support.test.Если вы хотите использовать jetpack, вы должны преобразовать всю тестовую библиотеку в androidx, если вы этого не хотите, просто удалите библиотеки androidx и используйте все com.android.support.test.Проверьте мой последний ответ в Android Instrumentation Testing: Инструментов не зарегистрировано Ошибка .Надеюсь, это поможет вам.

0 голосов
/ 29 апреля 2019

Что сработало для меня, так это полностью изменить обратно с

androidX

до

com.android.support

библиотеки в build.gradle

Обратите внимание: возможно, вам придется повторно импортировать библиотеки в вашем классе, например,

import androidx.test.runner.AndroidJUnitRunner;

до

import android.support.test.runner.AndroidJUnitRunner;

Также убедитесь, что вы всегда очищаете и перестраиваете проект после каждого добавления или удаления библиотеки из build.gradle.

0 голосов
/ 06 ноября 2018

У меня была такая же проблема, и есть разница между тестами, которые применяют методы в классах, теми стандартными единицами тесты , которые входят в app/src/test/java/<package>.Для пользовательского интерфейса тесты , которые взаимодействуют с кнопками, редактируют текст и т. Д., Требуют экспрессии и входят в app/src/androidTest/java/<package>.Мне потребовалось несколько чтений документации, и я потратил впустую день, прежде чем понял разницу.

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