No se puede resolver el símbolo 'AndroidJUnit4'

139

Obviamente necesito la declaración de importación correcta para resolver este problema. Según los documentos deAndroidJUnit4 , esto debería ser

import android.support.test.runner.AndroidJUnit4;

Cuando hago eso, Android Studio se resalta runneren rojo y se queja "No se puede resolver el símbolo 'corredor'".

Antecedentes

Llegué a este punto siguiendo los tutoriales en el sitio de desarrolladores de Android para configurar pruebas usando UI Automator . El primer problema que encontré fue eso com.android.support:support-v4:22.2.0y com.android.support.test:runner:0.2dependen de diferentes versiones de com.android.support:support-annotations. Seguí las sugerencias de este informe de errores de Android y agregué lo siguiente allprojectsen mi proyecto build.gradle:

configurations.all {
    resolutionStrategy.force 'com.android.support:support-annotations:22.1.0'
}

Esto resolvió el error inmediato, pero sospecho que condujo a mis problemas actuales. ¿Alguien tiene alguna sugerencia sobre cómo solucionar esto?

Secciones relevantes de `./gradlew: aplicación: dependencias

androidTestCompile - Classpath for compiling the androidTest sources.
+--- com.jayway.android.robotium:robotium-solo:5.2.1
+--- com.squareup:fest-android:1.0.8
|    \--- org.easytesting:fest-assert-core:2.0M10
|         \--- org.easytesting:fest-util:1.2.5
+--- com.android.support.test:runner:0.2
|    +--- junit:junit-dep:4.10
|    |    \--- org.hamcrest:hamcrest-core:1.1
|    +--- com.android.support.test:exposed-instrumentation-api-publish:0.2
|    \--- com.android.support:support-annotations:22.0.0 -> 22.2.0
+--- com.android.support.test:rules:0.2
|    \--- com.android.support.test:runner:0.2 (*)
\--- com.android.support.test.uiautomator:uiautomator-v18:2.1.0

compile - Classpath for compiling the main sources.
+--- com.android.support:appcompat-v7:22.2.0
|    \--- com.android.support:support-v4:22.2.0
|         \--- com.android.support:support-annotations:22.2.0
+--- com.android.support:support-v4:22.2.0 (*)
+--- com.google.android.gms:play-services:6.1.71
|    \--- com.android.support:support-v4:20.0.0 -> 22.2.0 (*)
+--- com.crashlytics.android:crashlytics:1.+ -> 1.1.13
\--- com.jakewharton:butterknife:5.1.2
Aprendiz de código
fuente
Eso sugiere que su compilación falta por com.android.support.test:runnercompleto. ¿Puede confirmar a través de gradle dependenciesque todavía está haciendo esto después del resolutionStrategycambio?
CommonsWare
@CommonsWare Se agregó salida de dependencias a mi pregunta. No sé qué (*)significa después com.android.support.test:runner:0.2.
Code-Apprentice
Según la gente de Gradle , el asterisco "significa que la vista de árbol del gráfico de dependencia se acorta en este punto porque esa parte del gráfico ya estaba listada anteriormente". Estoy perplejo de por qué esto no está funcionando para ti.
CommonsWare
1
Tenga en cuenta que la respuesta de @stemadsen de 2018 es potencialmente más relevante que las otras. Alguien escribió una vez sobre un examen que mantuvo las preguntas el mismo año tras año, pero las respuestas cambiaron ...
Roy Falk

Respuestas:

198

Asegúrese de que su aplicación esté en la variante de compilación de depuración. Vaya a Compilar> Seleccionar variante de compilación ... y se mostrará lo siguiente:

ingrese la descripción de la imagen aquí

orium
fuente
55
Gracias, me salvaste
Sofa
10
Salud. La documentación nunca dice "estas cosas solo funcionarán en depuración". Muy frustrante.
Chantell Osejo
27
Guau. Up-Vote x 1 millón. Esta es la respuesta que he estado buscando durante días. También encontré esto para que pueda cambiar qué tipo de compilación usar para él. android { testBuildType "staging"}
WIllJBD
55
Voy a tener que presentar un informe de error para esto con el equipo de Android Studio Tools. Incluso los tipos de compilación que heredan de debugno funcionan a menos que se establezca explícitamente en "depuración"
Gautham C.
1
wow, estoy usando un buildType cutom con initWith (buildTypes.debug) y aún falla. ¡Solo y solo si estoy usando la depuración funciona directamente!
Karoly
120

Cometí el error de poner las clases de prueba en src / test . Después de moverlos a src / androidTest / java / se resolvió la dependencia.

Mike
fuente
En mi caso, mi carpeta de prueba era src / test por alguna razón, luego tuve que cambiarle el nombre a src / androidTest y resolvió mi problema, después de 3 horas ...
Teo Inke
69

Ok, ¡aquí está tu error y el mío!

Si vamos a escribir una porción de código para la Prueba de Unidad Local, no deberíamos usarlo @RunWith(AndroidJUnit4.class)porque no usamos AndroidJUnit4 pero necesitamos Junit4. entonces deberíamos escribir @RunWith(JUnit4.class). Y, por supuesto, su archivo de prueba de Java está en el app/src/test/java/your.package.namedirectorio.

De lo contrario, si (!!) queremos escribir alguna prueba de unidad instrumentada de Android , deberíamos poner nuestros archivos de prueba de Java en el app/src/androidTest/java/your.package.namedirectorio y usar anotaciones como@RunWith(AndroidJUnit4.class)

Sepehr Behroozi
fuente
Estoy usando Maven, ¿entonces qué?
JohnyTex
2
@JohnyTex Usar Maven no afecta mi respuesta. Solo depende de la estructura del archivo de su proyecto.
Sepehr Behroozi
34

Actualizar

La Biblioteca de pruebas de Android ahora es parte de AndroidX. Asegúrese de utilizar las dependencias correctas de Gradle que se encuentran en la documentación oficial .

Respuesta original

Encontré aquí que hay versiones más nuevas de la Biblioteca de soporte de pruebas que las que estaba usando:

dependencies {
    androidTestCompile 'com.android.support.test:runner:0.5'
    androidTestCompile 'com.android.support.test:rules:0.5'
    androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
}

Nota: Asegúrese de usar las versiones más recientes de estas bibliotecas. Esta pregunta es de un momento en que la Biblioteca de soporte de prueba de Android era nueva y los números de versión aquí están muy desactualizados.

Aprendiz de código
fuente
3
Me pregunto por qué la documentación no menciona nada sobre esto, a menos que me lo haya perdido. Me habría ahorrado un poco de pena.
Nom1fan
@ Karoly todavía tengo problemas. ¿Encontraste alguna solución?
Mahdi
26

Resolví el problema haciendo un pequeño cambio en el archivo build.gradle de la aplicación. En la dependencies { ... }sección, asegúrese de incluir la siguiente línea:

debugImplementation 'com.android.support.test:runner:1.0.1'

o cualquier versión que sea la más nueva en ese momento ( ...Compileestá en desuso y ha sido reemplazada por ...Implementation). Tenga en cuenta el uso de debugImplementation. Android Studio sugirió incluirlo automáticamente con androidTestImplementation, lo que no funcionó.

Descubrí cómo cambiarlo de prueba a depuración mirando en la Estructura del proyecto en Dependencias del módulo de la aplicación, donde puede cambiar el alcance de cada dependencia, consulte a continuación.

Estructura del proyecto

Stemadsen
fuente
Tenga en cuenta que esto compilará la biblioteca de soporte de pruebas en el APK.
Code-Apprentice el
También funciona con testImplementation "com.android.support.test: rules: 1.0.2"
Prat
10

Tenga en cuenta que este OP ahora está en 2019, tiene 4 años, por lo que si está utilizando Android X AndroidJUnit4.classestá en desuso, tiene un error allí y uno más con esto androidx.test.ext.junit.runners.AndroidJUnit4. Sugiero leer estos enlaces para resolver el problema.

AndroidJUnit4.class está en desuso: ¿Cómo usar androidx.test.ext.junit.runners.AndroidJUnit4?

Migración de pruebas de Junit4 a androidx: ¿Qué causa que 'delegate runner no se pueda cargar'? Para mí, Android Studio sugirió reemplazar

@RunWith(AndroidJUnit4.class)

que fue obsoleto con

@RunWith(AndroidJUnit4ClassRunner.class)

y esto

androidx.test.ext.junit.runners.AndroidJUnit4

con este

import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;

Después de eso, el error desapareció, pero no sé si la prueba futura mientras se ejecuta ¿ok?

leonidaa
fuente
@ Code-Apprentice - Muchas gracias por editar, ahora es mucho mejor
leonidaa
8

En mi caso, esto ayudó para la variante de lanzamiento:

android {
    ...
    testBuildType "release" 
}
Andrew Glukhoff
fuente
¿Puedes dar una solución más completa? No entiendo el contexto de lo que hiciste.
Aprendiz de código
Encontré el problema "No se puede resolver el símbolo 'AndroidJUnit4'" en mi prueba de espresso cuando cambié la variante de compilación a "release". Tan pronto como agregué esta declaración (testBuildType "release") al nivel de aplicación build.gradle (tomado de developer.android.com/studio/test/index.html#add_a_new_test ) este problema desapareció.
Andrew Glukhoff
He formateado su respuesta el código en su respuesta. Debe agregar más detalles, como el enlace de su comentario y describir dónde va este bloque en su proyecto.
Code-Apprentice
7

La causa común de este problema es que al agregar la siguiente dependencia:

androidTestImplementation 'androidx.test.ext:junit:1.1.1'

Esta es una dependencia correcta si va a utilizar pruebas instrumentadas (pruebas en el androidTest paquete java)

Pero para implementar pruebas de unidades locales (pruebas en el testpaquete java) mientras se usa la dependencia mencionada anteriormente; entonces te enfrentarásCannot resolve symbol 'AndroidJUnit4'

Esto se debe a que la androidTestImplementationdirectiva se usa para importar bibliotecas en pruebas instrumentadas, pero no en las pruebas unitarias / JVM locales.

Si desea utilizarlo AndroidJUnit4en una prueba JVM / unidad local, utilice la siguiente dependencia en su lugar

testImplementation 'androidx.test.ext:junit:1.1.1'

Lo mismo se aplica si agrega la última dependencia mientras usa AndroidJUnit4 en la prueba instrumentada, también obtendrá Cannot resolve symbol 'AndroidJUnit4'; porque estás usando la directiva incorrecta.

Zain
fuente
1
En el escenario de mi pregunta original, estaba ejecutando pruebas instrumentadas. Sin embargo, esta es una gran distinción y con suerte ayudará a los visitantes a esta pregunta en el futuro.
Code-Apprentice
5

Si alguien todavía tiene este problema:

No se puede resolver el símbolo 'AndroidJUnit4'

y utilizando la API 27, build.gradleque se encuentra en el módulo de la aplicación, agregue las siguientes líneas:

testImplementation 'junit:junit:4.12'

// AndroidJUnitRunner and JUnit Rules
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test:rules:1.0.2'

// Espresso dependencies
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
tm81
fuente
3

pon este código en tus dependencias

compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
})
Paramatma Sharan
fuente
1
Cuando escribí esta pregunta, todavía no había agregado el espresso como una dependencia para las pruebas unitarias.
Code-Apprentice el
+1 En realidad lo descubrí justo antes de ver esto, pero sí, esto es lo que hice y resolvió mi problema.
Tony D
2
Siga las dos respuestas a continuación de @sepehr. La clase AndroidJunit4 no está en el paquete espresso, sino que está presente en el paquete android.support.test.runner. y todo lo que tiene que hacer es incluir @Runwith (AndroidJunit4.class) está escrito arriba / para el caso de prueba presente en src / Androidtest / java, INSTALADO incluido en casos de prueba escritos bajo src / test / java.
Khay
2

Si está utilizando un proyecto con múltiples tipos de compilación, el tipo de compilación seleccionado en la ventana de variante de compilación debe mencionarse con la etiqueta testBuildType en el archivo build.gradle del módulo.

Por ejemplo: si está utilizando la depuración de tipo de compilación , debe agregar android{testBuildType "debug" }, si está usando stage , agregue la android{testBuildType "stage"}declaración en la etiqueta de Android.

Rahul Rastogi
fuente
¿Está sugiriendo editar el archivo de compilación si desea cambiar la variante que se está probando?
nasch
2

Mueva la clase de prueba a src / androidTest / java /. Entonces la dependencia se resolverá.

Komal Nikhare
fuente
Lol ... realmente ...
Manish Kumar Sharma
1

¡El clásico Invalidate Caches / Restart me ha ayudado! :)

user_MGU
fuente
1

Agregue esta dependencia en su archivo build.gradle:

androidTestImplementation 'androidx.test.ext:junit:1.1.1'

Actualice la versión final ( 1.1.1) con la última versión lanzada.

KOUSHIKZEP99
fuente
0

Agregando

compile com.android.support.test:runner:0.5'

resolvió este problema exacto para mí.

donlys
fuente
Esto ya está indicado en la respuesta aceptada. También debe ver si hay una versión más reciente y usarla en su lugar.
Code-Apprentice
¿AndroidTestCompile es lo mismo que compilar?
donlys
compileLas directivas nombran las dependencias utilizadas en la aplicación principal, mientras androidTestComipleque las dependencias nombradas se utilizan para las pruebas. Entonces la respuesta correcta es usar androidTestCompile, no compile.
Code-Apprentice el
0

Como lo demuestra la lista de respuestas, esto puede ser causado por algunas cosas. Uno más para la lista:

Ejecuté una LINT excesivamente celosa que eliminó todas las importaciones no utilizadas. Esto producirá los mismos errores, y es fácil pasar por alto que este es el problema.

Android-studio resaltará las referencias que faltan en el código de prueba, y aparecerá la ventana emergente ALT-ENTER (este es el bit que es fácil de perder).

A continuación, necesito eliminar las pruebas de LINT, o al menos desactivar esta advertencia.

Editar: @ Code-Apprentice, las líneas que faltaban eran:

import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;


import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

Entonces, el primer error en el archivo fue @RunWith(AndroidJUnit4.class)al comienzo de mi clase de prueba.

winwaed
fuente
¿Puedes mostrar una prueba de ejemplo donde esto te sucedió?
Code-Apprentice
0

Versión de historia corta:

Actualice su Gradle a la última versión

Estoy respondiendo a esta pregunta el 15 de febrero de 2020. Desafortunadamente, he agotado todas las soluciones posibles mencionadas aquí y en otros lugares.

Sí, ninguno de ellos arriba funciona. Utilizo la función incorporada, "Migrar a Andoridx", puede recordarme que tengo que actualizar mis versiones de SDK de destino y mi versión de gradle. Después de actualizar mi versión de Gradle de 2.0.2 a 3.5.3. Simplemente funcionan, incluso la antigua declaración de importación funciona.

Bryan Zhang
fuente
Hola, esta es una pregunta antigua que ya tiene una respuesta aceptada y no veo cómo su respuesta agrega algo nuevo a la pregunta. Evite responder si su respuesta no agrega nada nuevo a las respuestas existentes. Gracias
hipopótamos
La respuesta aceptada proporciona un enlace para actualizar las dependencias de prueba a la biblioteca de pruebas de AndroidX. Esto es probablemente lo que lo solucionó en todas las cosas que probó.
Aprendiz de código
0

Se me ocurrió el mismo error cuando sigo la aplicación Google IOSched y configuro mi proyecto con tres tipos de compilación [debug, release, staging] donde debug y release comparten el mismo directorio de origen

sourceSets {
    debug.java.srcDir 'src/debugRelease/java'
    release.java.srcDir 'src/debugRelease/java'
}

En este caso, especifique el testBuildTypearchivo build.gradle en el nivel de módulo y el proyecto ahora debería poder resolver el símbolo 'AndroidJUnit4'.

...
sourceSets {
    debug.java.srcDir 'src/debugRelease/java'
    release.java.srcDir 'src/debugRelease/java'
}

testBuildType "staging"
...

Referencia: https://github.com/google/iosched/blob/master/mobile/build.gradle

Jie Heng
fuente