如何使用Robolectric在Android中测试菜单

时间:2014-02-18 13:58:46

标签: java android unit-testing tdd robolectric

我需要使用Robolectric在Android应用程序中编写测试菜单。

菜单的源代码:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
    switch (item.getItemId()) {
    case R.id.exit:
        this.finish();
        break;
    default:
        Toast.makeText(this, getString(R.string.errMsg), Toast.LENGTH_SHORT).show();
        break;
    }
    return super.onMenuItemSelected(featureId, item);
} 

请帮助编写测试

3 个答案:

答案 0 :(得分:8)

以下示例应该是任何开始使用Robolectric的人的一个很好的例子。它在AndroidStudio下使用Robolectric 3.0。

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 19)
public class MainActivityTest {
    @Test
    public void shouldCloseActivity() {
        MainActivity activity = Robolectric.setupActivity(MainActivity.class);
        MenuItem menuItem = new RoboMenuItem(R.id.exit);
        activity.onOptionsItemSelected(menuItem);
        ShadowActivity shadowActivity = Shadows.shadowOf(activity);
        assertTrue(shadowActivity.isFinishing());
    }
}

答案 1 :(得分:5)

实际上你应该尽量避免使用RoboMenuItem。您可以通过让robolectric创建活动并使其可见来获取活动创建的实际菜单。

MainActivity activity = Robolectric.buildActivity(MainActivity.class).create().visible().get();

然后,您可以使用ShadowActivity获取实际创建的菜单选项;

shadowOf(activity).getOptionsMenu()

获取实际的MenuItem:

shadowOf(activity).getOptionsMenu().findMenuItem(...)

然后,您可以将实际的menuItem传递给onOptionsItemSelected。

RoboMenuItem只是一个虚拟外观,实际上robolectric开发人员建议尽可能避免它。

答案 2 :(得分:2)

kingargyle在获取MenuItem方面有一个很好的答案。

如果您只想点击该项目,可以使用:

shadowOf(activity).clickMenuItem(R.id....);