IdlingResource不在AndroidTests中等待

时间:2016-07-15 15:04:22

标签: android testing android-espresso

我正在尝试测试MyActivity在传递不正确的意图附加内容时显示警告对话框。它是一个url,所以我将url传递给内部webView以加载url并在发生任何错误时显示警告。单击正面按钮时,应该关闭警报。

这是错误发生时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);
}

}

然而,测试总是失败:

  

&#34; AlertDialog不应该显示&#34;

我认为我并不了解真正发生的事情。我写了一些日志,我可以看到idlingResource1永远不会等待10秒。另外我知道alertDialog在被解雇时变为null但是在最后一次断言之后发生了,所以idlingResource2也没有工作?为什么?这是测试这个的正确方法吗?

2 个答案:

答案 0 :(得分:1)

IdlingResources让Espresso等待。但是你不使用Espresso进行测试(除了注册没有效果的IdlingResources),所以测试直接运行,无需等待,测试失败。

如果用简单的Thread.sleep()替换你的IdlingResources,你的测试应该有效。至少它会等待。

阅读一点关于Espresso的信息,这很简单,可以真正改善您的测试:https://developer.android.com/training/testing/ui-testing/espresso-testing.html

答案 1 :(得分:1)

我认为你没有以正确的方式使用Espresso。

尝试删除idlingResources,并将前三个断言替换为:

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

Espresso会等到UI线程变为空闲状态。

然后,点击Espresso方式点击:

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

和最后的断言:

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