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

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í


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.


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)


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.


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


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?


@ 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" 
}

¿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.


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'

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

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.


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


1

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


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.


0

Agregando

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

resolvió este problema exacto para mí.


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.


¿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.


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.