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

256

Para mis pruebas de instrumentación estaba usando

@RunWith(AndroidJUnit4.class)

de

import androidx.test.runner.AndroidJUnit4;

para establecer mis casos de prueba. Ahora esta línea se marca como obsoleta con la sugerencia para usar AndroidJUnit4desde

import androidx.test.ext.junit.runners.AndroidJUnit4

Sin embargo, si intento importar AndroidJUnit4desde el paquete con nombre, aparece el error, que extno se puede resolver.

¿Tiene una idea, qué paquete debe incluirse en gradle para resolver este problema?

Marcel Gangwisch
fuente
44
Creo que su fuente es obsoleta, no mencionan Androidx en absoluto.
Marcel Gangwisch
1
Las pruebas unitarias en Android son un completo desastre de errores y desvalorizaciones. Lo único que funciona para mí es crear un nuevo proyecto temporal, copiar los archivos relevantes de ese proyecto al mío, cambiar al modo de depuración y hacer una invalidación de caché completa. También para las pruebas de AndroidJUnit4, el nombre del paquete debe coincidir con el nombre del paquete de la biblioteca.
Rupert Rawnsley

Respuestas:

377

De acuerdo con la documentación para AndroidJUnit4 ,

  1. El archivo gradle debe contener la siguiente línea: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. Cambiar la clase de prueba AndroidJUnit4ClassRunnerdeAndroidJUnit4

Si todavía no funciona, asegúrese de limpiar y / o reconstruir su proyecto. También puede consultar la versión actual directamente en el repositorio maven de Google

Marcel Gangwisch
fuente
20
mi gradle tiene esto y todavía no puede resolver el problema.
zuko
@zuko Limpia y / o reconstruye tu proyecto, debería estar allí. Si aún no lo está y está utilizando módulos, verifique que su jerarquía de dependencia esté configurada como espera; es posible que también necesite agregarlos a los módulos de nivel superior, ya que las bibliotecas de prueba no se compilan en módulos compartidos para que los usen los módulos ascendentes.
Jon Adams
@JonAdams mi árbol de dependencias seguía manteniendo una referencia a bibliotecas más antiguas por alguna razón, aunque pensé que las había eliminado. así que después de probar varias cosas terminé migrando el proyecto a uno nuevo y todo está bien ahora.
zuko
77
¿Deberíamos también cambiar testInstrumentationRunner en el archivo gradle de androidx.test.runner.AndroidJUnitRunner a androidx.test.ext.junit.runners.AndroidJUnit4 ? Solo me pregunto si hay una falta de coincidencia.
Un droide
22
@A Droid Reemplace el paquete antiguo de AndroidJUnit4 en importación con uno nuevo Simplemente reemplace import androidx.test.runner.AndroidJUnit4; con importación androidx.test.ext.junit.runners.AndroidJUnit4;
Xplosive
28

Si probó la solución de @ MarcelGangwisch y su compilación falla al decir que no puede encontrar el recurso Y también limpió / reconstruyó su proyecto y todavía no funciona, intente esto: (basado también en la solución de @ KrzysztofDziuba)

En su archivo gradle donde cambió la dependencia, asegúrese de agregarlo como el tipo que necesita, es decir:

Para pruebas de IU:

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

Para pruebas unitarias:

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

En mi caso, lo agregué como ambos y ahora funciona.

JJ Du Plessis
fuente
13

Solución

  1. Agregue esta línea a build.gradle: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. Cambiar AndroidJUnit4a AndroidJUnit4ClassRunneren la clase de prueba

Advertencia

Recibí el mismo error, pero la siguiente solución me falló:

Archivo -> Invalidar cachés ..., y seleccione Invalidar y reiniciar

HeshanHH
fuente
12

Para mí, los siguientes pasos funcionaron:
1. Reemplace las bibliotecas de Androidx con la publicada aquí . mi final se app/build.gradleveía así:

android {
    ...
    defaultConfig {
        ...
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

    }
    ...
}

dependencies {
    ...
    testImplementation 'junit:junit:4.12'

    // Core library
    androidTestImplementation 'androidx.test:core:1.2.0'

    // AndroidJUnitRunner and JUnit Rules
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test:rules:1.2.0'

    // Assertions
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.ext:truth:1.2.0'
    androidTestImplementation 'com.google.truth:truth:0.42'

    // Espresso dependencies
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

}

Luego reemplacé manualmente los módulos importados en mi ExampleInstrumentTest.javaclase con las últimas clases:

import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(AndroidJUnit4ClassRunner.class)
public class ExampleInstrumentedTest {
    ...
    @Rule
    public final ActivityTestRule<MainActivity> main = new ActivityTestRule<>(MainActivity.class, true);

    @Before
    public void init() {
        ...
    }
    @Test
    public void listCount() {
        ...
    }

    @Test
    public void useAppContext() {
        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();

        Assert.assertEquals("in.curioustools.aad_x_testing2", appContext.getPackageName());
        System.out.println("useAppContext : Test Ran");
    }
}

Lo que me molestaba era el hecho de que la InstrumentationRegisteryclase todavía estaba en desuso. Así que solía InstrumentationRegistry.getInstrumentation().getTargetContext();de androidx.test.platform.app.InstrumentationRegistryclase.

ansh sachdeva
fuente
3
@RunWith(AndroidJUnit4ClassRunner.class)fue la parte que resolvió el problema en mi caso. Realmente no entiendo por qué Android Studio genera código obsoleto a veces.
Rafsanjani
Usar en ApllicationProvider.getApplicationContext<Context>()lugar deInstrumentationRegistry.getInstrumentation().getTargetContext();
Mitch
7

Intenté todo lo anterior hasta que fui al sitio oficial de Android, y sugirieron importar desde en androidx.test.ext.junit.runners.AndroidJUnit4lugar de androidx.test.runner.AndroidJUnit4. enlace

Prox
fuente
0

Si importó esas bibliotecas de prueba AnroidX, sincronizó y reconstruyó el proyecto, pero los paquetes importados aún no se resolvieron. Solo recuerde cómo actualizó su proyecto a AndroidX, cierre Android Studio, elimine la .ideacarpeta y vuelva a abrir su proyecto ...

¡Esto funcionó para mí!

Jeff T.
fuente
0
  1. Incluya estas líneas en el módulo de la aplicación build.gradle.

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

  2. En la clase de prueba, reemplace su corredor de prueba para

    importar androidx.test.ext.junit.runners.AndroidJUnit4;

  3. Si InstrumentationRegistry.getTargetContext()está en desuso, use InstrumentationRegistryde androidx.test.platform.appesta manera

    InstrumentationRegistry.getInstrumentation (). GetTargetContext ()

Balsamiq
fuente