web-dev-qa-db-fra.com

Android Espresso: impossible de résoudre le symbole AndroidJUnit4.class

J'essaie de créer un test d'interface utilisateur Espresso dans le nouveau projet Android, mais j'ai rencontré le problème suivant. 

Si j'ai essayé de créer une classe de test vide:

import Android.content.Intent;
import Android.support.test.rule.ActivityTestRule;
import Android.support.test.runner.AndroidJUnit4;
import Android.test.ActivityInstrumentationTestCase2;

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

import static Android.support.test.espresso.Espresso.onView;
import static Android.support.test.espresso.assertion.ViewAssertions.matches;
import static Android.support.test.espresso.matcher.ViewMatchers.withId;
import static Android.support.test.espresso.matcher.ViewMatchers.withText;


@RunWith(AndroidJUnit4.class)
public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> {

}

Je reçois toujours ce message d'erreur:

cannot resolve symbol AndroidJUnit4.class

Et presque toutes les bibliothèques importées sont marquées comme inutilisées.

le fichier build.gradle contient les éléments suivants:

apply plugin: 'com.Android.application'

Android {
    compileSdkVersion 23
    buildToolsVersion "23.0.0"

    defaultConfig {
        applicationId "com.some.thing.xxx"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
    lintOptions {
        abortOnError false
    }
    packagingOptions {
        exclude 'LICENSE.txt'
    }
}

repositories {
    mavenCentral()
    maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
    maven { url "https://jitpack.io" }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.Android.support:appcompat-v7:23.0.0'
    compile 'com.google.Android.gms:play-services:7.8.0'
    compile 'com.mcxiaoke.volley:library:1.0.18'
    compile 'com.orhanobut:logger:1.11'
    // App dependencies
    compile 'com.Android.support:support-annotations:23.0.0'
    // TESTING DEPENDENCIES
    androidTestCompile 'com.Android.support.test:runner:0.3'
    // Set this dependency to use JUnit 4 rules
    androidTestCompile 'com.Android.support.test:rules:0.3'
    // Set this dependency to build and run Espresso tests
    androidTestCompile 'com.Android.support.test.espresso:espresso-core:2.2'
    // add this for intent mocking support
    androidTestCompile 'com.Android.support.test.espresso:espresso-intents:2.2'
    // add this for webview testing support
    androidTestCompile 'com.Android.support.test.espresso:espresso-web:2.2'
    // Set this dependency to build and run UI Automator tests
    androidTestCompile 'com.Android.support.test.uiautomator:uiautomator-v18:2.1.1'
    androidTestCompile 'com.Android.support.test.espresso:espresso-contrib:2.2'
}

Si je mets ces paramètres sur mon autre projet de test, cela fonctionne, donc je ne sais pas ce qui peut être faux?

J'ai suivi ce tutoriel: "

http://www.vogella.com/tutorials/AndroidTestingEspresso/article.html

Et j’ai essayé de le résoudre en posant la question SO suivante: Impossible de résoudre le symbole 'AndroidJUnit4'

Mais sans la chance. 

Merci beaucoup pour tout conseil. 

18
redrom

J'ai aussi essayé le même tutoriel de Vogella et j'ai rencontré de nombreux problèmes. L'un des premiers problèmes que j'ai rencontrés a été un conflit de dépendance entre les versions d'annotation des bibliothèques v23 et les bibliothèques Espresso.

Ensuite, j'ai trouvé un autre tutoriel récemment mis à jour de Roger Hu " UI Testting with Espresso ". J'ai remarqué une remarque selon laquelle Espresso ne prend pas encore en charge Marshmallow.

Les dépendances ont été ajoutées comme suit:

androidTestCompile('com.Android.support.test.espresso:espresso-core:2.2') {
    // Necessary if your app targets Marshmallow (since Espresso
    // hasn't moved to Marshmallow yet)
    exclude group: 'com.Android.support', module: 'support-annotations'
}
androidTestCompile('com.Android.support.test:runner:0.3') {
    // Necessary if your app targets Marshmallow (since the test runner
    // hasn't moved to Marshmallow yet)
    exclude group: 'com.Android.support', module: 'support-annotations'
}

Cela a résolu mon conflit de dépendance et je n'ai vu aucun des autres problèmes se produire.

14
passerby

Je l'ai résolu en important manuellement ce qui suit. J'ai pensé qu'il devrait être importé automatiquement, mais ce n'est pas le cas:

import static Android.support.test.espresso.Espresso.onView;
import static Android.support.test.espresso.action.ViewActions.click;
import static Android.support.test.espresso.action.ViewActions.closeSoftKeyboard;
import static Android.support.test.espresso.action.ViewActions.typeText;
import static Android.support.test.espresso.assertion.ViewAssertions.matches;
import static Android.support.test.espresso.matcher.ViewMatchers.withId;
import static Android.support.test.espresso.matcher.ViewMatchers.withText;
9
yehyatt

Selon les changements ci-dessus, étant donné:

androidTestCompile 'com.Android.support.test:runner:0.3'

vous devez changer pour 

androidTestCompile('com.Android.support.test:runner:0.3') {
    exclude group: 'com.Android.support', module: 'support-annotations'
}

et pour moi cela ne fonctionnait même pas avec le changement ci-dessus, alors ce que j'ai remarqué, c'est qu'il me manquait l'inclusion ci-dessous:

androidTestCompile 'com.Android.support.test.uiautomator:uiautomator-v18:2.1.1'

et cela a bien fonctionné pour moi.

Le build.gradle complet peut être trouvé comme ci-dessous:

    apply plugin: 'com.Android.application'

    Android {
    compileSdkVersion 23
    buildToolsVersion "21.1.2"

    lintOptions {
        // IMPORTANT: We are disabling this rule to avoid build errors on PrettyTime. Although
        //pretty time references an InvalidPackage it does not do it in the code sections we use
        //given how easy this library is to use I would prefer not to replace it with something
        //like Joda-Time which is overkill for such a small section of the app.
        disable 'InvalidPackage'
    }

    packagingOptions {
        exclude 'LICENSE.txt'
    }

    defaultConfig {
        applicationId "co.test.dialer"
        minSdkVersion 18
        targetSdkVersion 22
        versionCode 15
        versionName "0.6.15."
        renderscriptTargetApi 22
        renderscriptSupportModeEnabled true
        testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
    }

    signingConfigs {
        production {
            storeFile file("keystore.jks")
            storePassword "hello"
            keyAlias "production"
            keyPassword "Android"
        }

        debug {
            storeFile file("keystore.jks")
            storePassword "hello"
            keyAlias "debug"
            keyPassword "Android"
        }

    }

    buildTypes {

        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.production
        }

        debug {
            minifyEnabled false
            debuggable true
            applicationIdSuffix ".debug"
            signingConfig signingConfigs.debug
        }

        internal_test {
            minifyEnabled false
            debuggable true
            applicationIdSuffix ".test"
            signingConfig signingConfigs.debug
        }
    }
}

    dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    compile 'com.Android.support:appcompat-v7:23.0.1'
    compile 'com.Android.support:support-v13:23.0.1'
    compile 'com.Android.support:cardview-v7:23.0.1'
    compile 'com.Android.support:design:23.0.1'
    compile 'com.Android.support:recyclerview-v7:23.0.1'
    compile 'com.google.Android.gms:play-services-gcm:8.1.0'
    compile 'com.jakewharton:butterknife:6.1.0'
    compile 'com.afollestad:material-dialogs:0.7.8.0'
    compile 'com.googlecode.libphonenumber:libphonenumber:3.1'
    compile 'com.mcxiaoke.volley:library:1.0.15'
    compile 'squizbit.com.jsonobjectified:jetjson:1.0.3@aar'
    compile 'com.google.Android.gms:play-services-analytics:8.1.0'

    releaseCompile 'co.test.dialersdk:dialersdk:1.0.8@aar';
    debugCompile 'co.test.dialersdk:dialersdk-debug:1.0.8@aar';    
    internal_testCompile 'co.test.dialersdk:dialersdk-internal_test:1.0.8@aar';

    androidTestCompile('com.Android.support.test:runner:0.3') {
        exclude group: 'com.Android.support', module: 'support-annotations'
    }
    androidTestCompile('com.Android.support.test:rules:0.3') {
        exclude group: 'com.Android.support', module: 'support-annotations'
    }
    androidTestCompile('com.Android.support.test.espresso:espresso-core:2.2') {
        exclude group: 'com.Android.support', module: 'support-annotations'
    }
    androidTestCompile('com.Android.support.test.espresso:espresso-intents:2.2') {
        exclude group: 'com.Android.support', module: 'support-annotations'
    }
    androidTestCompile('com.Android.support.test.espresso:espresso-contrib:2.2') {
        exclude group: 'com.Android.support', module: 'support-annotations'
        exclude group: 'com.Android.support', module: 'appcompat'
        exclude group: 'com.Android.support', module: 'support-v4'
        exclude module: 'recyclerview-v7'
    }
    androidTestCompile('com.Android.support.test.espresso:espresso-web:2.2') {
        exclude group: 'com.Android.support', module: 'support-annotations'
    }

    androidTestCompile 'com.Android.support.test.uiautomator:uiautomator-v18:2.1.1'


}

J'espère que cela aidera sûrement quelqu'un, car je me suis battu pendant une demi-journée pour le réparer, même après avoir suivi toutes les étapes du didacticiel Vogella.

5
Hiten Bahri

Je l'ai résolu en changeant la constante 

minSdkVersion 

vers la version 18 dans le fichier build.gradle .

Le fichier gradle.file suivant fonctionne:

apply plugin: 'com.Android.application'

Android {
    compileSdkVersion 23
    buildToolsVersion "23.0.0"

    defaultConfig {
        applicationId "com.something.xxx"
        minSdkVersion 18
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
    lintOptions {
        abortOnError false
    }
    packagingOptions {
        exclude 'LICENSE.txt'
    }
}

repositories {
    mavenCentral()
    maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
    maven { url "https://jitpack.io" }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.Android.support:appcompat-v7:23.0.0'
    compile 'com.google.Android.gms:play-services:7.8.0'
    compile 'com.mcxiaoke.volley:library:1.0.18'
    compile 'com.orhanobut:logger:1.11'

    // TESTING DEPENDENCIES
    androidTestCompile 'com.Android.support:support-annotations:23.0.0'
    androidTestCompile 'com.Android.support.test:runner:0.3'
    // Set this dependency to use JUnit 4 rules
    androidTestCompile 'com.Android.support.test:rules:0.3'
    // Set this dependency to build and run Espresso tests
    androidTestCompile 'com.Android.support.test.espresso:espresso-core:2.2'
    // add this for intent mocking support
    androidTestCompile 'com.Android.support.test.espresso:espresso-intents:2.2'
    // add this for webview testing support
    androidTestCompile 'com.Android.support.test.espresso:espresso-web:2.2'
    // Set this dependency to build and run UI Automator tests
    androidTestCompile 'com.Android.support.test.uiautomator:uiautomator-v18:2.1.1'
    androidTestCompile 'com.Android.support.test.espresso:espresso-contrib:2.2'
}
5
redrom

La raison pour laquelle vous recevez ce message d'erreur peut être parce que votre dossier où réside le test ne correspond pas à la spécification. Le dossier doit être src/androidTest/Java

Regardez cet article qui dit ...

Exécuter des tests unitaires instrumentés Pour exécuter vos tests instrumentés, suivez ces étapes:

Assurez-vous que votre projet est synchronisé avec Gradle en cliquant sur Sync Projet dans la barre d'outils. Exécutez votre test de l’une des manières suivantes: Pour exécuter un seul test, ouvrez la fenêtre Projet, puis cliquez avec le bouton droit de la souris sur un test et cliquez sur Exécuter. Pour tester toutes les méthodes d'une classe, cliquez avec le bouton droit de la souris sur classe ou méthode dans le fichier de test et cliquez sur Exécuter. Pour exécuter tous les tests dans un fichier répertoire, cliquez avec le bouton droit sur le répertoire et sélectionnez Exécuter les tests. Le Le plug-in Android pour Gradle compile le code de test instrumenté situé dans le répertoire par défaut (src/androidTest/Java /), construit un test APK et APK de production, installe les deux APK sur l’appareil connecté ou émulateur, et exécute les tests. Android Studio affiche ensuite les résultats de l'exécution du test instrumenté dans la fenêtre Exécuter.

Par conséquent les gens, pour test d'instrumentation le dossier doit être (n'oubliez pas le cas)

src/androidTest/Java

et pour les tests locaux, le dossier doit être 

src/test/Java

Vous pouvez ensuite avoir votre (vos) dossier (s) de package pour correspondre à votre package d'application

J'espère que cela aide la communauté!

4
Vincy

J'ai eu le même problème et j'ai résolu de changer mon Build Variant. Je courais le test dans la version release.

Quand j'ai changé pour "debug", ça marche

Vous pouvez probablement avoir plusieurs types de construction. Par défaut, le projet Android crée deux types de construction (debug/release), modifie la variante de construction en débogage ou définit la valeur comme indiqué ci-dessous. 

http://tools.Android.com/tech-docs/new-build-system/user-guide#TOC-Testing

Currently only one Build Type is tested. By default it is the debug Build Type, but this can be reconfigured with:
Android {
    ...
    testBuildType "staging"
}
2
Sam

Vous pouvez vous référer à cette réponse

"J'ai commis l'erreur de placer les classes de test à src/test. Après les avoir déplacées vers src/androidTest/Java/... la dépendance a été résolue. Peut-être que c'est aussi votre problème."

1
Swapnil