AndroidJUnit4.class est obsolète: comment utiliser androidx.test.ext.junit.runners.AndroidJUnit4?

256

Pour mes tests d'instrumentation que j'utilisais

@RunWith(AndroidJUnit4.class)

de

import androidx.test.runner.AndroidJUnit4;

afin d'établir mes cas de test. Maintenant, cette ligne est marquée comme obsolète avec l'indication à utiliser à AndroidJUnit4partir de

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

Cependant, si j'essaie d'importer à AndroidJUnit4partir du package nommé, j'obtiens l'erreur, cela extne peut pas être résolu.

Avez-vous une idée du package à inclure dans gradle pour résoudre ce problème?

Marcel Gangwisch
la source
4
Je pense que votre source est obsolète, ils ne mentionnent pas du tout androidx.
Marcel Gangwisch
1
Les tests unitaires sur Android sont un désordre complet de bugs et de dépréciations. La seule chose qui fonctionne pour moi est de créer un nouveau projet de travail, de copier les fichiers pertinents de ce projet dans le mien, de passer en mode débogage et de faire une invalidation complète du cache. Pour les tests AndroidJUnit4 également, le nom du package doit correspondre au nom du package de la bibliothèque.
Rupert Rawnsley

Réponses:

377

Selon la documentation pour AndroidJUnit4 ,

  1. Le fichier gradle doit contenir la ligne suivante: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. Changer la classe de test en AndroidJUnit4ClassRunnerdeAndroidJUnit4

Si cela ne fonctionne toujours pas, assurez-vous de nettoyer et / ou de reconstruire votre projet. Vous pouvez également vérifier la version actuelle directement dans le référentiel maven de Google

Marcel Gangwisch
la source
20
mon gradle a cela et ne peut toujours pas résoudre le problème.
zuko
@zuko Nettoyez et / ou reconstruisez votre projet, il devrait être là. Si ce n'est toujours pas le cas et que vous utilisez des modules, vérifiez que votre hiérarchie de dépendances est configurée comme prévu; vous devrez peut-être également les ajouter aux modules de niveau supérieur, car les bibliothèques de test ne sont pas compilées en modules partagés pour une utilisation par les modules en amont.
Jon Adams
@JonAdams, mon arbre de dépendances conservait une référence aux anciennes bibliothèques pour une raison quelconque, même si je pensais les avoir supprimées. donc après avoir essayé différentes choses, j'ai fini par migrer le projet vers un nouveau et tout va bien maintenant.
zuko
7
Devrions-nous également changer testInstrumentationRunner dans le fichier gradle de androidx.test.runner.AndroidJUnitRunner en androidx.test.ext.junit.runners.AndroidJUnit4 ? Je me demande simplement s'il y a un décalage.
Un Droid du
22
@A Droid Remplacez l'ancien package AndroidJUnit4 lors de l'importation par un nouveau. Remplacez simplement import androidx.test.runner.AndroidJUnit4; avec import androidx.test.ext.junit.runners.AndroidJUnit4;
Xplosive le
28

Si vous avez essayé la solution de @ MarcelGangwisch et que votre build échoue en disant qu'il ne trouve pas la ressource ET que vous avez également nettoyé / reconstruit votre projet et que cela ne fonctionne toujours pas, essayez ceci: (basé également sur la solution de @ KrzysztofDziuba)

Dans votre fichier de notes où vous avez modifié la dépendance, assurez-vous de l'ajouter comme type dont vous avez besoin, c'est-à-dire:

Pour les tests d'interface utilisateur:

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

Pour les tests unitaires:

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

Dans mon cas, je l'ai ajouté à la fois et maintenant cela fonctionne.

JJ Du Plessis
la source
13

Solution

  1. Ajoutez cette ligne dans build.gradle: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. Passer AndroidJUnit4à AndroidJUnit4ClassRunnerdans la classe de test

avertissement

J'ai eu la même erreur, mais la solution suivante a échoué pour moi:

Fichier -> Invalider les caches ... et sélectionnez Invalider et redémarrer

HeshanHH
la source
12

Pour moi, les étapes suivantes ont fonctionné:
1. Remplacez les bibliothèques androidx par celles publiées ici . ma finale app/build.gradleressemblait à ceci:

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'

}

J'ai ensuite remplacé manuellement les modules importés dans ma ExampleInstrumentTest.javaclasse par les dernières classes:

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");
    }
}

La chose qui me dérangeait était le fait que la InstrumentationRegisteryclasse était toujours déconseillée. J'ai donc utilisé InstrumentationRegistry.getInstrumentation().getTargetContext();de la androidx.test.platform.app.InstrumentationRegistryclasse.

ansh sachdeva
la source
3
@RunWith(AndroidJUnit4ClassRunner.class)était la partie qui a résolu le problème dans mon cas. Je ne comprends pas vraiment pourquoi le studio Android génère parfois du code obsolète.
Rafsandjani
Utiliser à la ApllicationProvider.getApplicationContext<Context>()place deInstrumentationRegistry.getInstrumentation().getTargetContext();
Mitch
7

J'ai essayé tout ce qui précède jusqu'à ce que je me rende sur le site officiel d'Android, et ils ont suggéré d'importer à la androidx.test.ext.junit.runners.AndroidJUnit4place de androidx.test.runner.AndroidJUnit4. lien

Prox
la source
0

Si vous avez importé ces bibliothèques de test AnroidX, synchronisé et reconstruit le projet, mais les packages importés n'étaient toujours pas résolus. N'oubliez pas comment vous avez mis à niveau votre projet vers AndroidX, fermez Android Studio et supprimez le .ideadossier et rouvrez votre projet à nouveau ...

Cela a fonctionné pour moi!

Jeff T.
la source
0
  1. Incluez ces lignes dans le module d'application build.gradle.

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

  2. Dans la classe de test, remplacez votre lanceur de test par

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

  3. Si InstrumentationRegistry.getTargetContext()est l' utilisation désapprouvée InstrumentationRegistryde androidx.test.platform.appcomme celui - ci

    InstrumentationRegistry.getInstrumentation (). GetTargetContext ()

Balsamiq
la source