Robolectric - 如何模拟 com.actionbarsherlock.view.MenuItem?

3
我正在尝试使用Robolectric编写测试来测试一个使用了SherlockActionBar的应用程序。我需要测试当选择一个MenuItem时,应用程序是否执行正确的操作,但是Robolectric库只提供了对android.view.MenuItem的模拟,而应用程序使用了onOptionItemSelected(com.actionbarsherlock.view.MenuItem)方法。
因此,我的问题是:
  • 也许有一种方法可以模拟com.actionbarsherlock.view.MenuItem吗?
  • 或者有什么解决方法或其他建议吗?
非常感谢您的帮助!

为什么需要特定的MenuItem实现? - Eugen Martynov
你不能使用SherlockActionBar并尝试使用android.view.MenuItem实现onOptionItemSelected() =) - Serj Lotutovici
我是为了测试而言。您也可以使用TestMenuItem或Mockito来模拟类。但是,为什么您需要在方法规范中要求actionbarcherlock MenuItem呢?您是否使用它的特定API? - Eugen Martynov
不幸的是,当我使用Robolectric提供的TestMenuItem测试类时,它调用了另一个onOptionItemSelected (android.view.MenuItem)方法,而这个方法并没有被我的类使用(顺便说一下,它也不能被使用)。这就是为什么我开始寻找解决办法的原因...由于某种原因,SherlockActionBar的作者使用了自己的接口来处理MenuItem - Serj Lotutovici
1个回答

5
所以……因为没有更优雅的方法来模拟com.actionbarsherlock.view.MenuItem,我做了这个:

  • 制作了一个实现com.actionbarsherlock.view.MenuItem接口的自定义类。
  • 在我的模拟类中添加了一个int字段来表示itemId。
  • 其他与MenuItem接口相关的方法保留为空白(也许会在其他测试中使用)。

结果得到了这种类型的测试:

com.actionbarsherlock.view.MenuItem item = new TestSherlockMenuItem(R.id.some_action);

activity.onOptionsItemSelected(item);

ShadowActivity shadowActivity = Robolectric.shadowOf(activity);
Intent startedIntent = shadowActivity.getNextStartedActivity();
assertNotNull(startedIntent);

ShadowIntent shadowIntent = Robolectric.shadowOf(startedIntent);
assertThat(shadowIntent.getComponent().getClassName(),
                equalTo(NextActivity.class.getName()));

顺便说一下,感谢Eugen Martynov尝试理解我的问题:)


2
使用Mockito来节省实现时间。你只需要两行代码:'com.actionbarsherlock.view.MenuItem item = mock(com.actionbarsherlock.view.MenuItem);' 和 'when(item.getId()).thenReturn(R.id.some_action);' - Eugen Martynov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接