Java.lang.Exception: пользовательский класс runner AndroidJUnit4 должен иметь открытый конструктор с сигнатурой AndroidJUnit4 (класс testClass)

Gradle выглядит так:

apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.google.developer.taskmaker" minSdkVersion 19 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } configurations.all { resolutionStrategy { force 'com.android.support:support-annotations:25.2.0' } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:25.2.0' compile 'com.android.support:recyclerview-v7:25.2.0' compile 'com.android.support:design:25.2.0' compile 'com.android.support:preference-v7:25.2.0' debugCompile 'im.dino:dbinspector:3.4.1@aar' // Android JUnit Runner compile 'com.google.android.gms:play-services-appindexing:8.4.0' // Android runner and rules support // add this for intent mocking support androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.2.2' // add this for webview testing support androidTestCompile 'com.android.support.test.espresso:espresso-web:2.2.2' compile 'com.android.support.test:runner:0.5' compile 'com.android.support.test:rules:0.5' compile 'com.android.support.test.espresso:espresso-core:2.2.2' } 

Единичный тест выглядит

 @RunWith(AndroidJUnit4.class) public class TestClass { @Rule public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(MainActivity.class); @Test public void buttonClick(){ onView(withId(R.id.fab)).perform(click()).check(matches(isDisplayed())); } } 

Сообщение об ошибке выглядит так:

 java.lang.Exception: Custom runner class AndroidJUnit4 should have a public constructor with signature AndroidJUnit4(Class testClass) at org.junit.runners.model.InitializationError.<init>(InitializationError.java:38) at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:111) at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86) at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26) at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:101) at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:87) at com.intellij.junit4.JUnit46ClassesRequestBuilder.collectWrappedRunners(JUnit46ClassesRequestBuilder.java:90) at com.intellij.junit4.JUnit46ClassesRequestBuilder.getClassesRequest(JUnit46ClassesRequestBuilder.java:51) at com.intellij.junit4.JUnit4TestRunnerUtil.buildRequest(JUnit4TestRunnerUtil.java:91) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:95) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) Process finished with exit code -1 

Я уже проверял другие ответы, но не получал решения. Пожалуйста, расскажите, где все пошло не так. При запуске этого кода я получаю ошибку

Solutions Collecting From Web of "Java.lang.Exception: пользовательский класс runner AndroidJUnit4 должен иметь открытый конструктор с сигнатурой AndroidJUnit4 (класс testClass)"

Причина 1: размещение тестов в неправильной папке

Эту ошибку можно реплицировать, создав новое приложение с шаблоном по умолчанию в Android Studio и скопировав автоматически созданный ExampleInstrumentedTest из папки androidTest в test папку:

Неправильное копирование инструментального теста в тестовую папку

Вот как выглядит ошибка:

Ошибка OPs java.lang.Exception: пользовательский класс runner AndroidJUnit4 должен иметь открытый конструктор с сигнатурой AndroidJUnit4 (класс testClass)

Обратите внимание, что для репликации проблемы вам также придется неправильно добавлять зависимости к модулю build.gradle :

Зависимостей в неправильном месте

Причина 2: неправильная конфигурация теста

Локальные модульные тесты и инструментальные тесты имеют разные конфигурации запуска. Если вы нажмете « Изменить конфигурации», как показано ниже:

Тестовая конфигурация

Вы должны увидеть свои инструментальные тесты под Android Instrumented Tests и ваши локальные тесты в Android JUnit как показано на рисунках ниже:

Для Android Instrumented Tests конфигурация должна выглядеть примерно так:

Тестовая конфигурация для Android

Для Android JUnit:

Тестовая конфигурация для тестов Android JUnit

Когда вы запустите тест, Android Studio создаст для вас конфигурацию прогона. Если конфигурация запуска не входит в категорию, проверьте правильность androidTest ваших test и androidTest папок, а затем вы можете удалить конфигурацию запуска из Edit configurations и снова запустить тест. Если вы правильно настроили, на этот раз Android Studio будет использовать правильный тип конфигурации запуска.

объяснение

В Android есть два типа тестов:

  1. Контрольные испытания
  2. Локальные модульные тесты

Контрольные испытания

Инструментальные тесты – это тесты, которые предназначены для работы на телефоне или эмуляторе . Это тесты, в которых вам необходим доступ к полнофункциональной части библиотеки Android (например, к реальному Context ). Они должны androidTest папке androidTest и зависимостях для этих тестов (например, Espresso, com.android.support.test.rules:0.5 ) будет иметь префикс androidTestCompile в вашем build.gradle .

Вот пример инструментального теста:

 import android.content.Context; import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; import static org.junit.Assert.assertEquals; /** * Instrumentation test, which will execute on an Android device. * * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> */ @RunWith(AndroidJUnit4.class) public class ExampleInstrumentedTest { @Test public void useAppContext() throws Exception { // Context of the app under test. Context appContext = InstrumentationRegistry.getTargetContext(); assertEquals("com.gyaltsab.myapplication", appContext.getPackageName()); } } 

Локальные модульные тесты

Локальные модульные тесты – это тесты, которые вы можете запускать в своей среде IDE . Обычно они не зависят от какой-либо части библиотеки Android, недоступной на стандартной JVM (например, они не будут зависеть от Context ). Зависимости для них идут в части build.gradle вашего build.gradle .

Вот пример единичного теста:

 import org.junit.Test; import static org.junit.Assert.*; /** * Example local unit test, which will execute on the development machine (host). * * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> */ public class ExampleUnitTest { @Test public void addition_isCorrect() throws Exception { assertEquals(4, 2 + 2); } } 

Обратите внимание, что локальные тесты не требуют аннотации @RunWith(AndroidJUnit4.class) в объявлении класса. Пожалуйста, ознакомьтесь с официальными документами для более полного объяснения.

У меня такая же проблема. Я работаю в студии Android 2.3.1. Я проверил свои настройки запуска. В разделе Run-> Edit Configurations и обнаруженный тест, который я пытался запустить в качестве инструментального теста, находился в категории тестов Android JUnit, хотя я имел его в каталоге androidTest в моем проекте. Я добавил Android Instrumented Test (нажмите кнопку «плюс» в углу) и установил, чтобы он указывал на те тесты, которые я пытался запустить. Это исправило это для меня.

Попробуйте переместить тестовый файл в папку androidTest.