Android тестирование ошибок ActivityResult с помощью эспрессо - PullRequest
0 голосов
/ 24 января 2020

У меня есть фрагмент в моей деятельности, он получает некоторые данные на своем onActivityResult(), и пытается обновить пользовательский интерфейс. Это мой onActivityResult() код:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {

            GET_USER_AUDIO_TO_TEXT_REQUEST_CODE -> {

                if (resultCode == RESULT_OK) {
                    data?.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS)?.let {
                    val receivedCityName = it[0]
                    binding.homeCityNameEditTextView.setText(receivedCityName)//Update UI at this line
                    viewModel.fetchWeatherCity(receivedCityName)
                }
                } else {
                    Toast.makeText(activity, R.string.error_while_getting_data_from_recognizer, Toast.LENGTH_SHORT).show()
                }
            }
        }
    }

Итак, я попытался создать тест для КИП с эспрессо для этой части, как показано ниже:

 @Test
 fun checkActionsAfterReceivingDataInOnActivityResult() {

        val intent = Intent()
        intent.putStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS, arrayListOf(DEFAULT_CITY_NAME))

        activityRule.activity.supportFragmentManager
                .findFragmentByTag(HomeFragment.CLASS_NAME)
                ?.onActivityResult(
                        HomeFragment.GET_USER_AUDIO_TO_TEXT_REQUEST_CODE,
                        Activity.RESULT_OK,
                        intent
                )

    }

Но я получу ошибку после того, как Запуск этого Test method, который говорит: Эта ошибка из-за моих ViewModel методов, которые будут работать. вызывая эту строку в onActivityResult ():

viewModel.fetchWeatherCity(receivedCityName)

Это ее ошибка:

java.lang.IllegalStateException: Cannot invoke setValue on a background thread
at android.arch.lifecycle.LiveData.assertMainThread(LiveData.java:435)
at android.arch.lifecycle.LiveData.setValue(LiveData.java:279)

И из-за обновления моего пользовательского интерфейса этой строкой:

binding.homeCityNameEditTextView.setText(receivedCityName)//Update UI at this line

Я тоже получу эту ошибку:

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Вы не должны вызывать такие методы, как onActivityResult, непосредственно в тесте Espresso. Вы всегда получите одну и ту же ошибку, потому что эти тесты выполняются в разных потоках. Если вы хотите проверить его правильно, вам следует рассмотреть возможность использования Espresso-Intents :

@Test
fun checkActionsAfterReceivingDataInOnActivityResult() {
    val intent = Intent()
    intent.putStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS, arrayListOf(DEFAULT_CITY_NAME))

    intending(hasComponent(YourActivity.class.getName())).respondWith(ActivityResult(Activity.RESULT_OK, intent))

    // onView(...).perform(click())
    // First do something to cause your app to launch the intended activity

    // onView(...).check(matches(...))
    // Then test something on activity result
}
0 голосов
/ 24 января 2020

Test instrumentation работает в другом потоке, поэтому оберните test method-body with run on UI thread.

activityRule.activity.runOnUiThread {
  // the test method body goes in here 
}

В вашем случае: -

activityRule.activity.runOnUiThread {
   activityRule.activity.supportFragmentManager
                .findFragmentByTag(HomeFragment.CLASS_NAME)
                ?.onActivityResult(
                        HomeFragment.GET_USER_AUDIO_TO_TEXT_REQUEST_CODE,
                        Activity.RESULT_OK,
                        intent)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...