Dima
Dima

Reputation: 49

How to restart Android app within Espresso test?

I am using Espresso with Kotlin for the UI test automation. I am trying to find a proper way to restart the app during the test and start it again, so the test scenario is the following:

The way our UI tests are organized: there is a test class where I have rules

val intent = Intent(ApplicationProvider.getApplicationContext(), MainActivity::class.java)
        .putExtra(UI_TEST_INTENT, true)

@get:Rule
val rule = ActivityScenarioRule<MainActivity>(intent)

there Before/After functions and tests functions in this class

What I want is to have generic restartApp function in separated class, let's say TestUtils and to be able to call it at any point of time, when is needed. So far I didn't find a solution. There are some similar questions on stackoverflow, but I am not sure I understand how to work with the answers I found, like this:

with(activityRule) {
finishActivity()
launchActivity(null)

}

Since ActivityTestRule is deprecated and documentation asking to use ActivityScenarioRule, I tried this:

@get:Rule
val rule = ActivityScenarioRule<MainActivity>(intent)

private fun restart() {
    rule.scenario.close()
    rule.scenario.recreate()
}

but it gets java.lang.NullPointerException

another option is

private fun restart() {
    pressBackUnconditionally()
    Intents.release()
    ActivityScenario.launch<MainActivity>(intent)
}

it works, app restarts but I can not interact with the app anymore, because for some reason there are two intents running now

Would be great to get an answer I can work with (I am quite new to Espresso)

Cheers

Upvotes: 3

Views: 2563

Answers (2)

Seems like the author's answer has some excess code. The following is enough

activityScenarioRule.scenario.close() 
ActivityScenario.launch(YourActivity::class.java, null)

Upvotes: 0

Dima
Dima

Reputation: 49

The solution is found:

private fun restart() {
    Intents.release()
    rule.scenario.close()
    Intents.init()
    ActivityScenario.launch<MainActivity>(intent)
}

Upvotes: 1

Related Questions