断言在解除CAB后,ActionBar项目变为可见

时间:2014-11-05 04:25:21

标签: android testing race-condition instrumentation

我显示了以下两个测试:

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菜单项确实可见?

1 个答案:

答案 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()没有通过。显然,这两项测试的组合都是正确的。