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()));
答案 0 :(得分:0)
有些事可能对你有所帮助......
在Espresso测试中调用
不是'Espresso'方式。除非你的测试被正确注释,否则它不会在UI线程上运行,所以这是一个你应该在Instrumentation线程的UI线程上调用的东西。你可以通过以下方式解决这个问题:mActivityRule.getActivity().showOptionDialog();
rule.runOnUiThread(new Runnable(){ @覆盖 public void run(){ 。mActivityRule.getActivity()showOptionDialog(); } });
执行此操作可能需要您构建自己的同步逻辑,以确保在此之前未运行未来的Espresso语句。
使用Espresso测试此方法的更好方法是在通常调用mActivityRule.getActivity().showOptionDialog();
的UI控件上使用onView(XXX).perform(click())
。
showOptionsDialog()
的字符串,您只需使用字符串资源ID,但这不是您所看到的问题的原因。< / LI>
醇>