2016-07-15 2 views
0

Я пытаюсь проверить MyActivity показывает диалоговое окно предупреждения, когда были переданы неправильные намерения. Это URL-адрес, поэтому я передаю URL-адрес внутреннему webView, чтобы загрузить URL-адрес и показать предупреждение, если произошла какая-либо ошибка. Предупреждение должно быть отклонено при нажатии на положительную кнопку.IdlingResource не ждет в Android-тестах

Это как alertDialog создается, когда происходит ошибка

// Method in `MyActivity.java` called when the url couldn't be loaded 
private void showAlertDialog(final String title, final String message) { 

    final MyActivity self = this; 
    runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       if (!isFinishing()) { 

        alertDialog = new AlertDialog.Builder(MyActivity.this) 
         .setTitle(title) 
         .setMessage(message) 
         .setCancelable(false) 
         .setPositiveButton(BUTTON_OK_TITLE, new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 
           dialog.dismiss(); 
           self.alertDialog = null; 
           //self.finishWithMessage(messageRaw, true); 
          } 
         }).create(); 
        alertDialog.show(); 
       } 
      } 
    }); 
} 

В тесте я использую ElapsedTimeIdlingResource taken from chiuki's answer подождать 10 секунд после запуска деятельности и утверждает alertDialog был создан и показом.

Затем я нажимаю кнопку предупреждения и снова жду 10 секунд, чтобы попытаться утверждать, что он ушел.

Это тестовый код MyActivityTest.java:

@RunWith(AndroidJUnit4.class) 
public class MyActivityTest { 

@Rule 
public ActivityTestRule<MyActivityTest> mActivityRule = new ActivityTestRule<>(MyActivityTest.class, true, false); 

@Test 
public void testErrorDialog() { 
    Intent intent = createIntentWithWrongExtras(); 
    mActivityRule.launchActivity(intent); 

    // Wait 
    IdlingResource idlingResource1 = new ElapsedTimeIdlingResource(10000); 
    Espresso.registerIdlingResources(idlingResource1); 

    assertNotNull("Activity should have been created", mActivityRule.getActivity()); 
    assertNotNull("AlertDialog should have been created", mActivityRule.getActivity().alertDialog); 
    assertTrue("AlertDialog should be showing", mActivityRule.getActivity().alertDialog.isShowing()); 

    // Test clicking the button dismisses the alert 
    mActivityRule.getActivity().runOnUiThread(() -> 
      mActivityRule.getActivity().alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick() 
    ); 

    IdlingResource idlingResource2 = new ElapsedTimeIdlingResource(10000); 
    Espresso.registerIdlingResources(idlingResource2); 

    assertTrue("AlertDialog should NOT be showing", mActivityRule.getActivity().alertDialog == null || !mActivityRule.getActivity().alertDialog.isShowing()); 

    Espresso.unregisterIdlingResources(idlingResource2); 
} 

} 

Однако тест всегда терпит неудачу:

"AlertDialog НЕ должен показывать"

Я не думаю, что я хорошо понимая, что действительно происходит. Я написал несколько журналов, и я вижу, что idlingResource1 не ждет 10 секунд. Также я знаю, что alertDialog становится null при увольнении, но это происходит после последнего утверждения, так что idlingResource2 тоже не работает? Зачем? Это правильный способ проверить это?

ответ

1

IdlingResources делают Espresso wait. Но вы не используете Espresso для тестирования (помимо регистрации IdlingResources, которые не имеют эффекта), поэтому тест проходит прямо, не дожидаясь, и ваш тест терпит неудачу.

Если вы замените свои IdlingResources простым Thread.sleep(), ваш тест должен работать. По крайней мере, он будет ждать.

Читайте немного о кофе эспрессо, это легко и действительно улучшить свой тест: https://developer.android.com/training/testing/ui-testing/espresso-testing.html

1

Я не думаю, что вы используете Эспрессо в правильном направлении.

Попробуйте удалить idlingResources и заменить первые три утверждения что-то вроде:

onView(use_matcher_to_match_the_dialog).check(matches(isDisplayed())); 

Эспрессо не будет ждать, пока поток пользовательского интерфейса, чтобы стать простаивает.

Затем сделайте щелчок в Эспрессо образом:

onView(use_matcher_to_match_the_button).perform(click()); 

и окончательное утверждение:

onView(use_matcher_to_match_the_dialog).check(matches(not(isDisplayed()))); 

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

  • Нет связанных вопросов^_^