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:
- Pruebas instrumentadas
- 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í.