6

Basically every time I have to execute an AndroidTest that makes use of mock location provider I need to manually check the box on device emulator: Settings--> mock locations. How to automate this task directly from the android test? Is there any way using espresso/uiautomator/something else?

Pro Mode
  • 1,453
  • 17
  • 30
Daniele
  • 1,332
  • 1
  • 13
  • 24
  • One half of a possible answer: http://stackoverflow.com/questions/36339817/is-there-an-adb-command-to-toggle-allow-mock-locations – Morrison Chang Sep 28 '16 at 16:51
  • Thanks I have added a comment on that question. Let's see... – Daniele Sep 28 '16 at 17:15
  • Have you tried to take that adb command and add it to https://developer.android.com/studio/run/rundebugconfig.html#android-tests as a Before Launch Operation – Morrison Chang Sep 28 '16 at 17:24
  • @MorrisonChang nice hint. I can try but anyway I really don't like it so much because not portable. I would prefer a more "standard" approach. That should be possible somehow I think. – Daniele Sep 28 '16 at 17:41
  • Not sure what you mean by "standard" unless you mean an officially documented thing to do via adb. – Morrison Chang Sep 28 '16 at 18:03

1 Answers1

6

I managed to do that in the way I wanted. Thanks to the links posted on comments. I added in my gradle file the following snippet:

task enableMockLocationForTestsOnDevice(type: Exec) {
    Properties properties = new Properties()
    properties.load(project.rootProject.file('local.properties').newDataInputStream())
    def sdkDir = properties.getProperty('sdk.dir')
    def adb = "$sdkDir/platform-tools/adb"
    description 'enable mock location on connected android device before executing any android test'
    commandLine "$adb", 'shell', 'appops', 'set', 'indian.fig.whatsaround', 'android:mock_location', 'allow'
}

afterEvaluate {
    // Note: the app must be already installed on device in order to this to run!
    connectedDebugAndroidTest.dependsOn enableMockLocationForTestsOnDevice
    connectedAndroidTest.dependsOn enableMockLocationForTestsOnDevice
}


// execute android tests before realising a new apk
tasks.whenTaskAdded { task ->
    if (task.name == 'assembleRelease') {
        task.dependsOn('enableMockLocationForTestsOnDevice')
        task.dependsOn('testReleaseUnitTest') // Run unit tests for the release build
        task.dependsOn('connectedAndroidTest') // Installs and runs instrumentation tests for all flavors on connected devices.

    }
}

If you also need to run the task before launching the app via android studio you need to add it as before run editing the "run" configuration.

Daniele
  • 1,332
  • 1
  • 13
  • 24
  • You can make sure that application is installed before **enableMockLocationForTestsOnDevice** is called by defining it as `task enableMockLocationForTestsOnDevice(type: Exec, dependsOn: 'installDebugAndroidTest')`. – David Sucharda Jul 26 '19 at 11:21