Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android IllegalStateException No instrumentation registered! Must run under a registering instrumentation

Tags:

I am struggling to make this functional test with Espresso work on Android. My App is a Multdex app so I am following the instructions written at this link as follows : (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

like image 213
Igor Regis Avatar asked Oct 05 '15 20:10

Igor Regis


1 Answers

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.

like image 176
Byte Welder Avatar answered Sep 24 '22 17:09

Byte Welder