android - 测试应出现在 ActionBar 中的 Fragment 菜单项

标签 android unit-testing junit robotium

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

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

测试代码如下:

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
    }
}

为了测试 fragment ,我创建了一个 stub FragmentTestActivity:

public class FragmentTestActivity extends FragmentActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_activity);
    }

    public void replaceFragment(Fragment fragment) {
        this.getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.fragment_container, fragment)
                .commit();
    }

}

设置复选框 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();
    }
};

和 logcat:

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)

最佳答案

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

关于android - 测试应出现在 ActionBar 中的 Fragment 菜单项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24072755/

相关文章:

java - Android:布局响应 Activity

unit-testing - Dart ,单元测试私有(private)方法

asp.net-mvc - 如何在 ASP.NET MVC 中测试 ajax 提交?

java - Selenium/Junit/pageObject : NPE, 调用方法时,该方法单击通过 @FindBy 注释创建的元素

java - 用于比较两个空对象的 junit 测试用例

android - 如何将项目从 bitbucket 存储库导入到 Android Studio?

android - 基于谷歌地图 API v2 的 Android 应用程序启动时的模糊 map 图 block

java - android中用户定义的对象数组

c# - 努力单元测试 : Argument 'xmlReader' is not valid

java - Mockito 说 "Wanted but not invoked"但调试测试跳转到那个方法