2016-04-20 6 views
7

У меня есть два приложения, которые взаимодействуют друг с другом через намерения. Я хотел бы подтвердить, что, допустим, Приложение A правильно называет startActivity для Приложение B без фактического запуска Приложение B. Я пробовал различные комбинации intending, и Espresso все еще запускает App B через намерение вместо того, чтобы просто его заглушить. Это приводит к сбою остальных тестов, поскольку пользовательский интерфейс блокируется Приложение B. Есть идеи?Ошибка при запуске с эспрессо

@RunWith(AndroidJUnit4.class) 
@LargeTest 
public class MyActivityUiIntentsTest 
{ 

    @Rule 
    public IntentsTestRule<MyActivity> activityRule = 
      new IntentsTestRule<>(MyActivity.class, true, false); 

    @Test 
    public void shouldStartOtherActivityWhenButtonClicked() 
    { 
     Intents.init(); 
     intending(toPackage("my.package")) 
      .respondWith(new ActivityResult(Activity.RESULT_OK, null)); 

     activityRule.launchActivity(new Intent()); 

     onView(withId(R.id.viewId)).perform(click()); 
     intended(hasComponent(hasShortClassName("the.other.class.name"))); 

     Intents.release(); 
    } 
} 

ОБНОВЛЕНО: Код для onClick:

@OnClick(R.id.viewId) 
public void startOtherActivity() 
{ 
    Intent intent = new Intent(); 
    intent.setClassName("my.package", "the.other.class.name"); 
    startActivity(intent); 
    finish(); 
} 
+1

Можем ли мы увидеть код Намерение создания в OnClick? И вы зарегистрировали имена пакетов по намерениям? Я намерен не поймать правильное намерение. – Blundell

+0

Добавлен код кода 'onClick'. – brwngrldev

+0

Какую версию API для устройства/эму вы используете? –

ответ

3

Переместите intending... ниже код launchActivity и удалить .init() потому что IntentsTestRule будет вызывать инициализации для вас после того, как деятельность начал

+0

Это исправило проблему, спасибо! – brwngrldev

2

Одним из возможных решений является наличие косвенность для намерения посылать.

Например, у нас есть IntentDispatcher, который мы заменяем тестовой реализацией в функциональных тестах ui с помощью трюка с помощью custom instrumentation test runner.

Реальная реализация IntentDispatcher просто вызывает context.startActivity() в то время как в тестах мы открываем специальную деятельность, которая отображает все содержимое Intent таким образом, мы смогли убедиться, что это было Intent, что мы хотели, чтобы обработать с Espresso matchers.

Также мы написали кучу правил, чтобы обрабатывать такие вещи, как открытие приложения для камеры и издевательство над результатом или просто издевательствование обычных звонков startActivity().

+0

Это также хорошая идея, спасибо, что поделились ею. – brwngrldev

Смежные вопросы