Как я могу проверить setResult() в тесте Android Espresso?
Есть ли хороший способ проверить код результата и данные в тесте Android Espresso? Я использую Espresso 2.0.
Предположим, что у меня есть Activity
, называемый BarActivity.class
, который после выполнения какого-либо действия вызывает setResult(int resultCode, Intent data)
с соответствующей полезной нагрузкой.
Я хотел бы написать тестовый пример, чтобы проверить resultCode
и data
. Однако, поскольку setResult()
- это метод final
, я не могу его переопределить.
Некоторые варианты, о которых я думал, были:
- Определите новый метод, например
setActivityResult()
, и просто используйте его, чтобы его можно было перехватить и т.д.
- Напишите тестовую TestActivity, которая вызовет
startActivityForResult()
на BarActivity
и проверит результат в TestActivity.onActivityResult()
Попытка подумать о том, что меньшее из двух зол, или если есть какие-либо другие предложения о том, как проверить это. Какие-либо предложения? Спасибо!
Ответы
Ответ 1
Если вы хотите перейти на 2.1, посмотрите Espresso-Intents:
Используя надуманный API (двоюродный брат Mockito.when), вы можете предоставить ответ для действий, запущенных с помощью startActivityForResult
В основном это означает, что можно создать и вернуть любой результат при запуске определенного действия (в вашем случае класс BarActivity).
Здесь вы можете проверить этот пример: https://google.github.io/android-testing-support-library/docs/espresso/intents/index.html#intent-stubbing
А также мой ответ по некоторой схожей проблеме (но с активностью выбора контактов), в которой я показываю, как построить результат и отправить его обратно Активность, которая называется startActivityForResult()
Ответ 2
Если вы перешли на последний Espresso, версия 3.0.1, вы можете просто использовать ActivityTestRule
и получить результат Activity следующим образом:
assertThat(rule.getActivityResult(), hasResultCode(Activity.RESULT_OK));
assertThat(rule.getActivityResult(), hasResultData(IntentMatchers.hasExtraWithKey(PickActivity.EXTRA_PICKED_NUMBER)));
Здесь вы можете найти рабочий пример .