Android 测试片段';s应显示在操作栏中的菜单项

Android 测试片段';s应显示在操作栏中的菜单项,android,unit-testing,junit,robotium,Android,Unit Testing,Junit,Robotium,在我的应用程序中,单击某个复选框可以启用操作栏上的菜单项。当我手动运行应用程序时,此功能正常工作。但是,当检查菜单项的视图时,自动JUnit/Robotium测试失败 为什么我在测试套件中看到不同的行为 以下是测试代码: public class FilterCardsTest extends ActivityInstrumentationTestCase2<FragmentTestActivity> { public FilterCardsTest() {

在我的应用程序中,单击某个复选框可以启用操作栏上的菜单项。当我手动运行应用程序时,此功能正常工作。但是,当检查菜单项的视图时,自动JUnit/Robotium测试失败

为什么我在测试套件中看到不同的行为

以下是测试代码:

public class FilterCardsTest extends ActivityInstrumentationTestCase2<FragmentTestActivity> {

    public FilterCardsTest() {
        super(FragmentTestActivity.class);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();

        this.activity = this.getActivity();
        this.activity.replaceFragment(new FilterCards());
        this.getInstrumentation().waitForIdleSync();
        this.solo = new Solo(this.getInstrumentation(), this.activity);
    }

    public void testBrandCheckBox() {
        this.testCheckBox(R.id.brand_check, R.id.brand_input);
    }

    private void testCheckBox(int checkId, int inputId) {
        CheckBox cb = (CheckBox) this.activity.findViewById(checkId);
        EditText input = (EditText) this.activity.findViewById(inputId);
        this.solo.clickOnView(cb);
        this.getInstrumentation().waitForIdleSync();
        Assert.assertTrue(input.isEnabled());
        Assert.assertTrue(input.hasFocus());

        Assert.assertTrue(this.solo.waitForView(R.id.save_menu)); // FilterCardsTest.java:106
    }
}
以及设置onClickListener()复选框的代码以及启用菜单项的代码:

@Override
public void onPrepareOptionsMenu(Menu menu) {
    MenuItem confirm = menu.findItem(R.id.save_menu);

    if (this.numberChecked() > 0) {
        confirm.setVisible(true);
        confirm.setEnabled(true);
    } else {
        confirm.setVisible(false);
        confirm.setEnabled(false);
    }
}

private View.OnClickListener onCheckBoxClick = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        EditText input = null;

        for (int i = 0; i < CHECKBOXES.length; i++) {
            if (v.getId() == CHECKBOXES[i]) {
                input = (EditText) FilterCards.this.getActivity().findViewById(TEXT_FIELDS[i]);
            }
        }

        FilterCards.this.toggleTextField(input);
        FilterCards.this.getActivity().supportInvalidateOptionsMenu();
    }
};

由于
FragmentTestActivity
仅扩展
FragmentActivity
,因此操作栏项不会出现。它应该扩展
ActionBarActivity

您可以添加准确的错误消息吗?这是断言失败吗?还是控制失败了?@Rob谢谢你的提醒。我应该更清楚。我还注释了发生断言失败的那一行,因此推测它正在等待20秒(默认超时),并且保存菜单永远不会出现。你正在看这个测试运行,不是吗?保存是否从未出现?前面的两个断言会让您认为触发操作的代码中没有错误?在测试运行期间,保存图标从未出现。但是当我手动运行它时,它确实运行了。@Rob有一个想法:
onPrepareOptions菜单()
在一个
片段中。为了测试,我有一个
FragmentTestActivity
,它将
片段
加载到存根活动中。这可能是我在测试和手动执行应用程序期间看到的不同行为的原因。
@Override
public void onPrepareOptionsMenu(Menu menu) {
    MenuItem confirm = menu.findItem(R.id.save_menu);

    if (this.numberChecked() > 0) {
        confirm.setVisible(true);
        confirm.setEnabled(true);
    } else {
        confirm.setVisible(false);
        confirm.setEnabled(false);
    }
}

private View.OnClickListener onCheckBoxClick = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        EditText input = null;

        for (int i = 0; i < CHECKBOXES.length; i++) {
            if (v.getId() == CHECKBOXES[i]) {
                input = (EditText) FilterCards.this.getActivity().findViewById(TEXT_FIELDS[i]);
            }
        }

        FilterCards.this.toggleTextField(input);
        FilterCards.this.getActivity().supportInvalidateOptionsMenu();
    }
};
junit.framework.AssertionFailedError
at bbct.android.common.activity.test.FilterCardsTest.testCheckBox(FilterCardsTest.java:106)
at bbct.android.common.activity.test.FilterCardsTest.testBrandCheckBox(FilterCardsTest.java:114)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214)
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199)
at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:192)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:190)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:175)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1584)