Я разрабатываю приложение для Android с использованием Kotlin. Я пишу инструментальные тесты для моего кода. Сейчас я пытаюсь написать инструментальный тест для определенной функциональности. Ниже приведен сценарий, для которого я хочу написать тест.
У меня есть три действия: LoginActivity, RegisterActivity и HomeActivity. LoginActivity запускает RegisterActivity с помощью метода startActivityForResult. Затем в RegisterActivity после регистрации он завершает действие с использованием метода finishActivity. Поэтому вызывается обратный вызов onActivityResult класса LoginActivity. Внутри onActivityResult он запускает HomeActivity с помощью метода startActivity.
Итак, как я могу проверить это, если HomeActivity запускается в рамках обратного вызова onActivityResult для LoginActivity, когда регистрация завершена в RegisterActivity?
Это мой текущий неполный код в попытке проверить эту конкретную функциональность
@RunWith(AndroidJUnit4::class)
class RegisterFormTest
{
@Rule @JvmField
val registerActivityRule: ActivityTestRule<RegisterActivity> = ActivityTestRule<RegisterActivity>(RegisterActivity::class.java)
@Before
fun setUp() {
}
@Test fun registerFormStartsHomeActivityAfterLogin() {
Intents.init()
FakeAuthService.SCENARIO_UNDER_TEST = FakeAuthService.SCENARIO_REGISTER_SUCCESSFUL
onView(withId(R.id.register_button_submit)).perform(click())
val accessToken = (registerActivityRule.activity.application as MockApplicationController).getLocalStorage()?.getString(ApplicationController.PREF_KEY_ACCESS_TOKEN, "")
Assert.assertEquals(FakeAuthService.FAKE_ACCESS_TOKEN, accessToken)
Thread.sleep(1000)
Intents.intended(IntentMatchers.hasComponent(HomeActivity::class.java.name))
Intents.release()
}
}
Но приведенный выше тест не работает. Это не удается. Как правильно проверить мой сценарий?
Так я завершаю действие в классе RegisterActivity
setResult(Activity.RESULT_OK)
finish()
Это обратный вызов onActivityResult в классе LoginActivity
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == RegisterActivity.ACTIVITY_CODE && resultCode == Activity.RESULT_OK) {
startHomeActivity()
}
}
Это ошибка
2019-10-21 14: 51: 08.642 25433-25461 / com.example.memento E / TestRunner: ----- начало исключения ----- 2019-10-21 14: 51: 08.642 25433-25461 / com.example.memento E / TestRunner: junit.framework.AssertionFailedError: Требуется совпадение с 1 намерением. Фактически соответствует 0 намерений.
IntentMatcher: has component: has component with: class name: is "com.example.myapp.HomeActivity" package name: an instance of java.lang.String short class name: an instance of java.lang.String
Matched intents:[]
Recorded intents:[]
at junit.framework.Assert.fail(Assert.java:50)
at androidx.test.espresso.intent.VerificationModes$Times.verify(VerificationModes.java:80)
at androidx.test.espresso.intent.Intents.internalIntended(Intents.java:346)
Все работает, как и ожидалось, когда я проверяю его вручную с использованием фактического устройства.