警报对话框崩溃Android测试 - "无法在未调用Looper.prepare()"

时间:2017-06-07 13:58:37

标签: java android android-espresso

    AlertDialog.Builder builder = new AlertDialog.Builder(activity);
    builder.setMessage(message)
            .setCancelable(false)
            .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    login(activity);
                }
            })
            .setNegativeButton("No", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {

                    dialog.cancel();
                    activity.finish();
                }
            });
    AlertDialog alert = builder.create(); // Crash
    alert.show();

应用程序正常运行并在我正常运行时显示警告对话框,但是当我在检测测试中运行它时,它在builder.create的第一行崩溃:

        final AlertDialog dialog = new AlertDialog(P.mContext, mTheme);

有这个例外:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

这会关闭应用,然后测试失败,因为没有任何活动:

android.support.test.espresso.NoActivityResumedException: No activities in stage RESUMED. Did you forget to launch the activity. (test.getActivity() or similar)?

这是一个线程问题,但根据答案here,这不是我的预期:

  

要验证是否显示对话框,您只需检查是否显示带有对话框内文本的视图:

     

onView(withText("dialogText")).check(matches(isDisplayed()));

我不明白,如果在创建对话框之前应用程序崩溃,我应该检查文本是否显示。

编辑:

    mActivityRule.launchActivity(intent);

    mActivityRule.getActivity().showOptionDialog();

    onView(withText(mActivityRule.getActivity().getString(R.string.dialogText))).check(matches(isDisplayed()));

1 个答案:

答案 0 :(得分:0)

有些事可能对你有所帮助......

  1. 在Espresso测试中调用mActivityRule.getActivity().showOptionDialog();不是'Espresso'方式。除非你的测试被正确注释,否则它不会在UI线程上运行,所以这是一个你应该在Instrumentation线程的UI线程上调用的东西。你可以通过以下方式解决这个问题:

    rule.runOnUiThread(new Runnable(){     @覆盖     public void run(){         。mActivityRule.getActivity()showOptionDialog();     } });

  2. 执行此操作可能需要您构建自己的同步逻辑,以确保在此之前未运行未来的Espresso语句。

    使用Espresso测试此方法的更好方法是在通常调用mActivityRule.getActivity().showOptionDialog();的UI控件上使用onView(XXX).perform(click())

    1. 此外,您不需要自己解析传递给showOptionsDialog()的字符串,您只需使用字符串资源ID,但这不是您所看到的问题的原因。< / LI>