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
- Android - Espresso - desplazamiento a un elemento no listado Ver
- Android Espresso: el filtrado de prueba no es compatible con la versión dada de JUnit. Actualice la versión de JUnit por lo menos a 4.6
- Cómo recuperar el acceso a una actividad después de enviarlo al fondo
- Cómo obtener cobertura para el proyecto de Android utilizando las pruebas de Espresso
- Espresso check all in list
@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
- Prueba Espresso con RxLoader
- Android - Fragmento independiente herramienta de prueba de interfaz de usuario
- ¿Cómo conseguir que Spoon tome capturas de pantalla para las pruebas de Espresso?
- Cómo usar Espresso + JMockit
- Cómo obtener informes de cobertura de código de google Firebase para Android Espresso tests
- Android Espresso - ¿Cómo comprobar la pista EditText?
- Actividad de ensayo y fragmento específico con espresso
- Android Espresso - afirma el texto en la pantalla contra la cadena de recursos
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
:
Esto es lo que parece el error:
Tenga en cuenta que para replicar el problema también tendría que agregar incorrectamente dependencias al build.gradle
nivel de build.gradle
:
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:
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:
Para 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:
- Ensayos instrumentados
- 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.
- ¿Por qué mi animación deja un rastro?
- ¿Por qué setImageBitmap no tiene efecto en ImageButton personalizado?