Java.lang.Exception: La clase de corredor personalizada AndroidJUnit4 debe tener un constructor público con la firma AndroidJUnit4 (clase testClass)

Gradle se parece a:

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' } 

Un caso de prueba de unidad parece

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

Mensaje de error:

 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 

Ya he comprobado otras respuestas, pero no conseguir la solución. Por favor, decir dónde va mal. Al ejecutar este código estoy recibiendo error

Causa 1: realizar pruebas en la carpeta incorrecta

Este error se puede replicar creando una nueva aplicación con la plantilla predeterminada en Android Studio y copiando la ExampleInstrumentedTest generada automáticamente ExampleInstrumentedTest desde la carpeta androidTest a la carpeta de test :

Copiar incorrectamente una prueba instrumentada en la carpeta de prueba

Esto es lo que parece el error:

El error de los OPs java.lang.Exception: La clase del corredor de encargo AndroidJUnit4 debe tener un constructor público con la firma AndroidJUnit4 (class class de prueba)

Tenga en cuenta que para replicar el problema también tendría que agregar incorrectamente dependencias al build.gradle nivel de build.gradle :

Dependencias en el lugar equivocado

Causa 2: Configuración incorrecta de la prueba

Las pruebas unitarias locales y las pruebas instrumentadas tienen diferentes configuraciones de Run. Si hace clic en Editar configuraciones como a continuación:

Configuración de prueba

Debería ver sus pruebas instrumentadas bajo Android Instrumented Tests y las pruebas de unidad locales bajo el Android JUnit como en las ilustraciones siguientes:

Para las pruebas instrumentadas de Android, la configuración debería tener el siguiente aspecto:

Test config para Android Pruebas instrumentadas

Para Android JUnit:

Test config para las pruebas de Android JUnit

Al ejecutar una prueba, Android Studio creará una configuración de ejecución para usted. Si la configuración de ejecución está en la categoría incorrecta, compruebe que tiene las carpetas de test y androidTest correctas y, a continuación, puede eliminar la configuración de ejecución de las configuraciones de Edit configurations y ejecutar la prueba de nuevo. Si ha configurado correctamente, Android Studio utilizará el tipo correcto de configuración de ejecución esta vez.

Explicación

Hay dos tipos de pruebas en Android:

  1. Ensayos instrumentados
  2. Pruebas unitarias locales

Ensayos instrumentados

Las pruebas instrumentadas son pruebas diseñadas para ejecutarse en un microteléfono o emulador . Se trata de pruebas en las que es necesario acceder a una parte completamente funcional de la biblioteca de Android (como un Context real, por ejemplo). Estos deben ir en la carpeta androidTest y dependencias para estas pruebas (por ejemplo, Espresso, com.android.support.test.rules:0.5 ) se prefijará con androidTestCompile en su build.gradle .

Aquí hay un ejemplo de prueba instrumentada:

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

Pruebas unitarias locales

Las pruebas de unidad locales son pruebas que se pueden ejecutar en su IDE . Normalmente no dependen de ninguna parte de la biblioteca de Android que no esté disponible en una JVM estándar (por ejemplo, no dependerán de Context ). Las dependencias de estos van en la parte testCompile de su build.gradle .

Aquí hay un ejemplo de prueba unitaria:

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

Tenga en cuenta que las pruebas de unidad local no necesitan la @RunWith(AndroidJUnit4.class) en la declaración de clase. Consulte los documentos oficiales para obtener una explicación más completa.

Yo tuve el mismo problema. Estoy trabajando en Android 2.3.1. Revisé mis configuraciones de ejecución. Bajo Run-> Edit Configurations y descubrió la prueba que estaba intentando ejecutar como una prueba instrumentada estaba bajo la categoría de pruebas de JUnit para Android, aunque la tenía en el directorio androidTest de mi proyecto. He añadido una prueba instrumentada de Android (pulsa el botón más en la esquina) y lo configuro para que apunte a la prueba que estaba intentando ejecutar. Eso me lo arregló.

Intente mover su archivo de prueba a la carpeta androidTest.

  • Ejecución de pruebas específicas utilizando Espresso y Spoon
  • ¿Cómo hacer clic en un elemento SimpleCursorAdapter ListFragment en Espresso?
  • Espresso no registra ninguna intención si no hay botones
  • Android.util.Pair mantiene String como parámetros en androidTest pero nulo en (unidad) prueba
  • ¿Hay alguna manera de saber si se ha iniciado una actividad con Espresso?
  • Automatización del selector de números en android utilizando espresso
  • Android Espresso compruebe el texto seleccionado del hilandero
  • Android Conflict con dependencia appcompat
  • NPE @ android.support.v7.widget.RecyclerView $ LayoutManager.detachViewInternal
  • Android - Espresso - menú de opciones largas - haga clic en una opción-elemento de menú que no esté visible
  • Android: Espresso no espera hasta que se muestre fragmento o actividad para que cada prueba fallara
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.