【问题标题】:How to test menu in Android with Robolectric如何使用 Robolectric 在 Android 中测试菜单
【发布时间】:2014-02-18 13:58:45
【问题描述】:

我需要使用 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);
} 

请帮忙写测试

【问题讨论】:

  • 这里没有人会为你编写测试,所以你自己尝试一下,然后再提出一个更详细的问题。
  • 提示:TestMenu,TestMenuItem。
  • @Daniel 在 Robolectric 3.x 中有:TestMenu, TestMenuItem

标签: java android unit-testing tdd robolectric


【解决方案1】:

以下示例对于刚开始使用 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());
    }
}

【讨论】:

  • 为什么我们需要ShadowActivity?我们可以直接调用activity.isFinishing()... 不完全明白。
【解决方案2】:

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

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

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

shadowOf(activity).getOptionsMenu()

要获取实际的 MenuItem:

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

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

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

【讨论】:

  • 嗨,我有这样的事情 - MainActivity activity = Robolectric.buildActivity(MainActivity.class).create().start().get();,如果我将 start() 更改为 visible(),我会得到 stackoverflow 异常。知道是什么导致了这个问题吗?
【解决方案3】:

kingargyle 对获取 MenuItem 有一个很好的回答。

但是,如果您只想能够单击该项目,则可以使用:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多