J'ai du mal à faire fonctionner ce test fonctionnel avec Espresso sur Android. Mon application est une application Multdex, je suis donc les instructions écrites sur ce lien comme suit: ( https://developer.Android.com/tools/building/multidex.html ).
J'ai déjà configuré mon build.gradle comme ceci:
apply plugin: 'com.Android.application'
apply plugin: 'Android-apt'
def AAVersion = '3.3.2'
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:Android-apt:1.4'
}
}
apt {
arguments {
androidManifestFile variant.outputs[0].processResources.manifestFile
resourcePackageName 'br.com.foo'
}
}
Android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "br.com.foo"
minSdkVersion 15
targetSdkVersion 21
Android.enforceUniquePackageName = false
multiDexEnabled true
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
testApplicationId "br.com.foo.test"
testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
testInstrumentationRunner "com.Android.test.runner.MultiDexTestRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.txt'
}
}
dexOptions {
preDexLibraries = false
javaMaxHeapSize "4g"
}
packagingOptions {
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
}
configurations.all {
resolutionStrategy.force 'com.Android.support:support-annotations:22.1.0'}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
apt "org.androidannotations:androidannotations:$AAVersion"
compile "org.androidannotations:androidannotations-api:$AAVersion"
compile 'com.github.PhilJay:MPAndroidChart:v2.1.0'
compile 'com.github.daimajia:AndroidViewAnimations:v1.1.3'
compile 'com.makeramen:roundedimageview:2.1.1'
compile 'com.github.ACRA:acra:acra-4.6.2'
compile 'com.github.rahatarmanahmed:circularprogressview:2.3.2'
compile 'com.github.jhy:jsoup:jsoup-1.8.3'
compile project(':cacscore')
compile project(':croplib')
compile project(':zxingandroid')
compile project(':paho')
compile project(':urlImageViewHelper')
compile project(':facebookSDK')
compile project(':googleDateTimePickers')
compile 'com.Android.support:support-v4:22.0.0'
compile 'com.Android.support:appcompat-v7:22.0.0'
compile 'com.google.Android.gms:play-services:7.8.0'
compile 'com.Android.support:multidex:1.0.0'
compile 'org.Apache.commons:commons-lang3:3.4'
compile files('libs/httpmime-4.1.jar')
compile files('libs/jackson-all-1.9.11.jar')
compile files('libs/jaxrs-api-2.2.1.GA.jar')
compile files('libs/spring-Android-core-1.0.1.RELEASE.jar')
compile files('libs/spring-Android-rest-template-1.0.1.RELEASE.jar')
compile 'com.melnykov:floatingactionbutton:1.2.0'
compile files('libs/trace.jar')
testCompile 'junit:junit:4.12'
testCompile 'org.powermock:powermock-api-mockito:1.6.2'
testCompile 'org.powermock:powermock-module-junit4-rule-agent:1.6.2'
testCompile 'org.powermock:powermock-module-junit4-rule:1.6.2'
testCompile 'org.powermock:powermock-module-junit4:1.6.2'
androidTestCompile 'junit:junit:4.12'
// androidTestCompile('com.Android.support.test:testing-support-lib:0.1') {
// exclude group: 'junit' // junit:junit-dep conflicts with junit:unit
// }
androidTestCompile 'com.Android.support.test:runner:0.4'
// Set this dependency to use JUnit 4 rules
androidTestCompile 'com.Android.support.test:rules:0.4'
// Set this dependency to build and run Espresso tests
androidTestCompile 'com.Android.support.test.espresso:espresso-core:2.2.1'
// Set this dependency to build and run UI Automator tests
// androidTestCompile 'com.Android.support.test.uiautomator:uiautomator-v18:2.1.2'
androidTestCompile('com.Android.support:multidex-instrumentation:1.0.1') {
exclude group: 'com.Android.support', module: 'multidex'
}
}
J'ai configuré le profil Run à partir du Android Studio définissant la classe testInstrumentationRunner sur com.Android.test.runner.MultiDexTestRunner.
Lorsque j'exécute la commande " adb Shell pm list instrumentation" J'ai cette sortie:
instrumentation:br.com.doe.test/com.Android.test.runner.MultiDexTestRunner (target=br.com.doe)
instrumentation:br.com.foo.test/com.Android.test.runner.MultiDexTestRunner (target=br.com.foo)
instrumentation:br.com.foo/com.Android.test.runner.MultiDexTestRunner (target=br.com.foo)
Mais je reçois toujours cette sortie lorsque j'essaie d'exécuter mes tests:
Testing started at 17:23 ...
Installing br.com.foo
DEVICE Shell COMMAND: pm install -r "/data/local/tmp/br.com.foo"
pkg: /data/local/tmp/br.com.foo
Success
Uploading file
local path: F:\Android\CACS\cacs\cacs\build\outputs\apk\cacs-debug-androidTest-unaligned.apk
remote path: /data/local/tmp/br.com.foo.test
Installing br.com.foo.test
DEVICE Shell COMMAND: pm install -r "/data/local/tmp/br.com.foo.test"
pkg: /data/local/tmp/br.com.foo.test
Success
Running tests
Test running started
Java.lang.IllegalStateException: No instrumentation registered! Must run under a registering instrumentation.
at Android.support.test.InstrumentationRegistry.getInstrumentation(InstrumentationRegistry.Java:45)
at br.com.bagger.inicio.MapaEnderecoTest.setUp(MapaEnderecoTest.Java:35)
at Android.test.AndroidTestRunner.runTest(AndroidTestRunner.Java:191)
at Android.test.AndroidTestRunner.runTest(AndroidTestRunner.Java:176)
at Android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.Java:554)
at Android.app.Instrumentation$InstrumentationThread.run(Instrumentation.Java:1701)
Finish
Et c'est le test unique que j'essaie de lancer:
package br.com.doe.inicio;
import Android.support.test.InstrumentationRegistry;
import Android.support.test.espresso.Espresso;
import Android.support.test.espresso.action.ViewActions;
import Android.support.test.espresso.matcher.ViewMatchers;
import Android.support.test.runner.AndroidJUnit4;
import Android.test.ActivityInstrumentationTestCase2;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import br.com.foo.R;
@RunWith(AndroidJUnit4.class)
public class MapaEnderecoTest extends ActivityInstrumentationTestCase2<MapaEndereco>
{
private MapaEndereco mActivity;
public MapaEnderecoTest()
{
super(MapaEndereco.class);
}
@Override
@Before
protected void setUp() throws Exception
{
super.setUp();
injectInstrumentation(InstrumentationRegistry.getInstrumentation());
mActivity = getActivity();
}
@Test
public void testeAbertura()
{
Espresso.onView(ViewMatchers.withId(R.id.map)).perform(ViewActions.click());
}
}
L'erreur se produit juste après l'appel super.setUp (), sur la méthode setUp.
J'ai l'instrumentation enregistrée dans le fichier AndroidManifest:
<instrumentation
Android:label="Multdex"
Android:name="com.Android.test.runner.MultiDexTestRunner"
Android:targetPackage="br.com.foo"
Android:functionalTest="true"/>
Et le problème auquel je suis confronté n'est pas le même que celui décrit ici Exception NullPointer lors de l'utilisation d'Espresso
Le problème est avec ces lignes de gradle:
testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
testInstrumentationRunner "com.Android.test.runner.MultiDexTestRunner"
Vous avez besoin d'un MultiDexTestRunner
, mais cette classe est dérivée de InstrumentationTestRunner
. Votre code a besoin d'un lanceur de test dérivé de AndroidJUnitRunner
Une solution consiste à créer un TestRunner
personnalisé qui étend AndroidJUnitRunner
et implémente le code MultiDex:
import Android.os.Bundle;
import Android.support.multidex.MultiDex;
import Android.support.test.runner.AndroidJUnitRunner;
public class TestRunner extends AndroidJUnitRunner
{
@Override
public void onCreate(Bundle arguments)
{
MultiDex.install(getTargetContext());
super.onCreate(arguments);
}
}
Il vous suffit d'ajouter une seule ligne Gradle qui fait référence à votre testInstrumentationRunner
personnalisé. Cela garantira que le système de génération génère le AndroidManifest.xml
propriétés nécessaires pour exécuter les tests avec ce programme.
J'ai eu une erreur similaire et j'ai beaucoup de mal à la réparer. Bien que la réponse acceptée ait aidé le PO, cela n'a pas résolu mon cas, j'ai donc décidé que c'était bien si j'enregistrais ma solution ici, j'espère que cela aidera quelqu'un d'autre aussi.
Mon problème était que je mixais AndroidJUnit4
, InstrumentationRegistry
, ApplicationProvider
et AndroidJUnitRunner
versions/packages. Assurez-vous qu'ils sont tous de la même génération. Ce sont les cours qui ont tout fait pour moi:
androidx.test.runner.AndroidJUnitRunner
androidx.test.platform.app.InstrumentationRegistry
androidx.test.ext.junit.runners.AndroidJUnit4
androidx.test.core.app.ApplicationProvider
pour ceux-ci, j'avais besoin des éléments suivants dans la partie dependencies
de mon build.gradle
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
androidTestImplementation 'androidx.test:core:1.2.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test:rules:1.2.0'
Et bien sûr, le bon
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
dans mon defaultConfig
du build.gradle
Au lieu de:
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
J'ai dû utiliser une bibliothèque différente:
androidTestImplementation 'com.Android.support.test.espresso:espresso-core:3.0.2'