web-dev-qa-db-fra.com

Android IllegalStateException Aucune instrumentation enregistrée! Doit fonctionner sous une instrumentation d'enregistrement

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

20
Igor Regis

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.

14
Ken Van Hoeylandt

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 AndroidJUnitRunnerversions/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

9
Boris Strandjev

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'
1
David Kennedy