Я пытаюсь проверить 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
тоже не работает? Зачем? Это правильный способ проверить это?