Android IllegalStateException No instrumentation r

2019-02-04 20:38发布

I'm struggling to make this funcional test with Espresso work on Android. My App is a Multdex app so I am following the instructions written at this link (https://developer.android.com/tools/building/multidex.html).

I have already configured my build.gradle like this:

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'
        }
    }

I configured the Run profile from the Android Studio setting the testInstrumentationRunner classe to com.android.test.runner.MultiDexTestRunner.

When I execute the command "adb shell pm list instrumentation" I have this output:

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)

But still I receive this output when I try to execute my 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

And this is the unique test that I am trying to run:

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

The error occurs right after the super.setUp() call, on the setUp method.

I have the instrumentation registered into the AndroidManifest file:

<instrumentation
        android:label="Multdex"
        android:name="com.android.test.runner.MultiDexTestRunner"
        android:targetPackage="br.com.foo"
        android:functionalTest="true"/>

And the problem I am facing is not the same as described here NullPointer Exception when using Espresso

1条回答
太酷不给撩
2楼-- · 2019-02-04 20:53

The problem is with these gradle lines:

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"

You need a MultiDexTestRunner, but this class is derived from InstrumentationTestRunner. Your code needs a test runner that is derived from AndroidJUnitRunner

A solution is to create a custom TestRunner that extends AndroidJUnitRunner and implements the MultiDex code:

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

You only need to add a single Gradle line that references your custom testInstrumentationRunner. This will ensure that the build system generates the AndroidManifest.xml properties that are needed to run the tests with this runner.

查看更多
登录 后发表回答