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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With