Как я могу проверить 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)));

Здесь вы можете найти рабочий пример .