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.
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.
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;
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.
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'
}
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é!
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.
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"
}
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."