Android Инструментальное тестирование, если активность открывается с помощью обратного вызова onActivityResult. - PullRequest
0 голосов
/ 21 октября 2019

Я разрабатываю приложение для 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)

Все работает, как и ожидалось, когда я проверяю его вручную с использованием фактического устройства.

1 Ответ

0 голосов
/ 21 октября 2019

Рассмотрите возможность установки результата в RegisterActivity, передав флаг в Intent и передав Intent в setResult(OK,Intent). Это Intent будет содержать флаг, указывающий, что регистрация была завершена.

В onActivityResult() из LoginActivity извлеките флаг (логическое значение) из Intent, который вы передали в RegisterActivity, и передайте этот флаг вIntent используется для запуска HomeActivity. Проверьте Intent в onCreate() из HomeActivity и убедитесь, что флаг был пройден, указывая, что регистрация была завершена.

Если флаг получен, установите значение TextView для некоторой случайной строки по вашему выбору, указывающей, а затем убедитесь, что текст этой TextView соответствует вашей случайной строке, используя эспрессо-сопоставители.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...