我显示了以下两个测试:
public void testOnClickCheckboxStartActionMode() {
int index = 4;
this.solo.clickOnCheckBox(index);
Assert.assertTrue(this.solo.waitForView(R.id.delete_menu));
}
public void testOnClickCheckboxStopActionMode() {
this.testOnClickCheckboxStartActionMode();
int index = 4;
this.solo.clickOnCheckBox(index);
View addMenu = this.activity.findViewById(R.id.add_menu);
Assert.assertNotNull(addMenu);
Assert.assertTrue(addMenu.isShown());
}
当我检查ListView中的项目时,第一次检查我的ActionMode是否正确启动。第二个检查取消选中ListView项后ActionMode停止。问题是testOnClickCheckboxStopActionMode()
在Assert.assertTrue(addMenu.isShown());
行失败。我可以在我的应用程序中手动验证正确的行为,因此测试似乎被打破了。我认为问题是这个断言发生在UI线程有机会删除CAB并恢复常规ActionBar之前。
我已尝试Instrumentation.runOnMainSync()
以便将我的测试与UI线程同步:
this.inst.runOnMainSync(new Runnable() {
@Override
public void run() {
View addMenu = activity.findViewById(R.id.add_menu);
Assert.assertNotNull(addMenu);
Assert.assertTrue(addMenu.isShown());
}
});
它仍然在同一个断言中失败。更糟糕的是,整个测试套件停止了,而不是简单地指示失败的测试并继续下一个,因为AssertionFailedError
被抛出在一个单独的线程上。
如何正确地与主线程同步,以验证在我的测试结束时ActionBar
菜单项确实可见?
答案 0 :(得分:0)
我可以通过拨打Solo.waitForView()
:
public void testOnClickCheckboxStopActionMode() {
this.testOnClickCheckboxStartActionMode();
int index = 4;
this.solo.clickOnCheckBox(index);
// Added this call:
Assert.assertTrue(this.solo.waitForView(R.id.add_menu));
View addMenu = ButterKnife.findById(this.activity, R.id.add_menu);
Assert.assertNotNull(addMenu);
Assert.assertTrue(addMenu.isShown());
}
奇怪的是,我最初尝试在修复错误时使用waitForView()
修改此测试。但是,单独它不会导致测试在出现bug时失败。另一方面,错误修复后addMenu.isShown()
没有通过。显然,这两项测试的组合都是正确的。