Поскольку вы хотите протестировать взаимодействие высокого уровня с вашим приложением, вы должны использовать UI Automator test framework .
Сначала добавьте библиотеку в build.gradle
:
dependencies {
...
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
}
Затем напишите тест, подобный этому:
@RunWith(AndroidJUnit4::class)
class MainActivityTest {
@get:Rule
val mainActivityRule = ActivityTestRule(MainActivity::class.java)
@Test
fun mainActivityHistoryIsForgottenAfterStartingLoginActivity()
{
// mainActivityRule makes sure MainActivity is launched, so we just need to wait
// for MainActivity to launch LoginActivity
Thread.sleep(MainActivity.LAUNCH_DELAY)
// Wait some more since the system is not instantaneous
Thread.sleep(1000)
// Now LoginActivity should be showing. Press the back button
val uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
uiDevice.pressBack()
// Wait some more still since the system is not instantaneous
Thread.sleep(1000)
// Make sure that we have left our app, i.e. pressing back have closed our app
// BuildConfig.APPLICATION_ID is the package name of our app
// So if the currently active package (app) is NOT our own app, it means
// our own app was closed, which is what we want to test.
assertNotEquals(uiDevice.currentPackageName, BuildConfig.APPLICATION_ID)
}
}
Обратите внимание, что у вас не должно быть этого:
@Rule @JvmField
val loginActivityRule: ActivityTestRule<LoginActivity> = ActivityTestRule<LoginActivity>(LoginActivity::class.java)
, так как это запустит LoginActivity
в началеконтрольная работа.Вы этого не хотите.Вы хотите, чтобы MainActivity
запустил LoginActivity
.Также обратите внимание, что вы можете упростить
@Rule @JvmField
val mainActivityRule: ActivityTestRule<MainActivity> = ActivityTestRule<MainActivity>(MainActivity::class.java)
до
@get:Rule
val mainActivityRule = ActivityTestRule(MainActivity::class.java)
И вам не понадобится
@Before
fun setUp() {
}
, поскольку он пуст и ничего не делает.