gpt4 book ai didi

android - IdlingResource 不在 AndroidTests 中等待

转载 作者:行者123 更新时间:2023-11-28 21:09:34 24 4
gpt4 key购买 nike

我正在尝试测试 MyActivity 在传递不正确的 intent extras 时显示一个警告对话框。这是一个 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在启动 Activity 后等待 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 should NOT be showing"

我认为我没有很好地理解到底发生了什么。我写了一些日志,我可以看到 idlingResource1 从不等待 10 秒。我还知道 alertDialog 在被关闭时变为 null 但那是在最后一个断言之后发生的,所以 idlingResource2 也不起作用吗?为什么?这是测试这个的正确方法吗?

最佳答案

IdlingResources 让 Espresso 等待。但是您没有使用 Espresso 进行测试(除了注册无效的 IdlingResources 之外),因此测试直接运行而无需等待,并且您的测试失败。

如果您用简单的 Thread.sleep() 替换您的 IdlingResources,您的测试应该可以工作。至少它会等待。

阅读一些关于 Espresso 的内容,它很简单并且会真正提高你的测试:https://developer.android.com/training/testing/ui-testing/espresso-testing.html

关于android - IdlingResource 不在 AndroidTests 中等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38399426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com