Espresso IntentsTestRule на тесте с несколькими действиями - PullRequest
0 голосов
/ 11 мая 2019

Я пытаюсь заглушить результат камеры Android с помощью библиотеки Espresso-Intents.

Я понимаю, что для инициализации библиотеки Espresso-Inents мне нужно определить IntentsTestRule. Я определил правило, основанное на первом действии, в которое входит мой тест - MainActivity.class, поэтому правило записывается так:

@Rule
public IntentsTestRule<MainActivity> mIntentsTestRules = new IntentsTestRule(MainActivity.class);

Проблема заключается в том, что MainActivity никогда не загружается, так как намерение запуска системы регистрируется Espresso-Intents.

Я получаю это исключение:

java.lang.RuntimeException: Could not launch intent Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=com.greenpathenergy.facilitysurveyapp/.ui.activities.MainActivity } within 45 seconds.

Более того, поскольку это намерение перехватывается Espresso-Intents, и мне нужно перейти от MainActivity к EditorActivity в этом же блоке @Test, как я могу пропустить некоторые внутренние Intent, одновременно заглушая внешние (например, когда EditorActivity вызывает API камеры), которые запускаются в EditorActivity?

Спасибо, любезно!

1 Ответ

1 голос
/ 11 мая 2019

Цель IntentsTestRule - только инициализировать Esspresso-Intents перед выполнением любых тестов в блоке @Test. IntentsTestRule просто вызывает Intents.init () перед блоком @Test и Intents.release () после завершения блока @Test.

При этом, если вы хотите заглушить только определенные Intents внутри блока @Test, следует инициализировать Espresso-Intents перед действием в блоке @Test, который запускает внешнее (для экземпляра вашего приложения) намерение (такое как нажмите кнопку, чтобы загрузить камеру), и сразу же отпустите Espresso-Intents после того, как мы вернем нашу заглушку.

Это наиболее упрощенный подход к разрешению внутренних намерений при одновременном заглушении внешних намерений.

Пример кода:

@Test
public void MainActivityTest {
   // Tap the button that loads the EditorActivity from MainActivity
   onView(withId(R.id.btn_load_editor_activity)).perform(click());

   // Initialize Espresso-Intents library to capture the external Intent to the camera API 
    Intents.init();

    // ActivityResult will be provided as a stub result for the camera API's natural result
    // Note: I've ignored the bitmap creation and instead used null for simplicity, you will
    // want to mock the bitmap here by creating a fake picture as the resultData
    ActivityResult result = new ActivityResult(Activity.RESULT_OK, null);

    // Notify Espresso the stub result above should be provided when it sees an Intent to load the camera API
    intending(toPackage("com.android.camera2")).respondWith(result);

    // Simulate a button tap of the button that loads the camera API, the stub will be automatically returned as the result immediately
    // instead of the camera API opening and sending back its result
    onView(withId(R.id.btn_take_placard_photo)).perform(click());

    // Release the Espresso-Intents library to allow other internal Intents to work as intended without being intercepted by Espresso-Intents
    Intents.release();
}

Надеюсь, вы найдете это полезным!

...