unitest unit tutorial test support studio book android android-espresso

tutorial - java.lang.Exception: la clase de corredor personalizado AndroidJUnit4 debe tener un constructor público con la firma AndroidJUnit4(clase testClass)



unit test android (5)

Causa 1: colocar las pruebas en la carpeta incorrecta

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

Así es como se ve 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 de prueba incorrecta

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

Debería ver sus pruebas instrumentadas bajo Android Instrumented Tests y sus pruebas de unidad local bajo el Android JUnit como en las ilustraciones a continuación:

Para las pruebas instrumentadas de Android, la configuración debería verse como a continuación:

Para Android JUnit:

Cuando ejecute 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, verifique que las carpetas de test y test androidTest correctas, luego puede eliminar la configuración de ejecución de las configuraciones de Edit configurations y ejecutar la prueba nuevamente. Si se ha configurado correctamente, Android Studio usará el tipo correcto de configuración de ejecución esta vez.

Explicación

Hay dos tipos de pruebas en Android:

  1. Pruebas instrumentadas
  2. Pruebas unitarias locales

Pruebas instrumentadas

Las pruebas instrumentadas son pruebas diseñadas para ejecutarse en un teléfono o emulador . Estas son pruebas en las que necesita acceso a una parte completamente funcional de la biblioteca de Android (como un Context real, por ejemplo). Estos deben ir en la carpeta de androidTest y las dependencias para estas pruebas (por ejemplo, Espresso, com.android.support.test.rules:0.5 ) se prefijarán 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 local son pruebas que puede 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 del Context ). Las dependencias para estos van en la parte testCompile de su build.gradle .

Aquí hay un ejemplo de prueba de unidad:

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 unidades locales no necesitan la @RunWith(AndroidJUnit4.class) en la declaración de la clase. Por favor, consulte los documentos oficiales para una explicación más completa.

Gradle se ve como:

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

Caso de prueba de unidad se parece a

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

El mensaje de error parece:

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 estoy obteniendo una solución. Por favor, diga dónde va mal. Al ejecutar este código me sale un error


En mi caso, el problema se resolvió colocando la siguiente línea:

@RunWith(AndroidJUnit4ClassRunner.class)


Intente mover su archivo de prueba a la carpeta de prueba de Android.


Solución: debe cambiar la carpeta de prueba de prueba a prueba de android y editar la configuración de la prueba (o mover el archivo de prueba de prueba a la prueba de android editar la configuración de prueba)

Encontré la solución en este video: https://youtu.be/TGU0B4qRlHY?t=9m36s

y aquí: - https://.com/a/30172064/5723125


Yo tuve el mismo problema. Estoy trabajando en Android studio 2.3.1. Revisé mis configuraciones de ejecución. Bajo Ejecutar-> Editar configuraciones y descubrí la prueba que estaba tratando de ejecutar, ya que una prueba instrumentada estaba en la categoría de pruebas de Android JUnit, aunque la tenía en el directorio de prueba de Android en mi proyecto. Agregué una prueba instrumentada de Android (presioné el botón más en la esquina) y la configuré para que apunte a la prueba que estaba tratando de ejecutar. Eso lo arregló para mí.