我正在尝试测试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
也没有工作?为什么?这是测试这个的正确方法吗?
答案 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())));