我发现这个example,他们使用PowerMock和EasyMock来存储/模拟Android的Menu和MenuItem类。我一直在尝试使用Activity类与PowerMock和Mockito做类似的事情。
我知道很多方法都是最终的,在Android.jar中它们都只是抛出RuntimeException(“Stub!”)。
我也明白这个测试并不完整,但我只是想看看是否可以模拟android Activity类。
但鉴于PowerMock允许你用最终方法模拟类,这个代码不应该有用吗?
@RunWith(PowerMockRunner.class)
@PrepareForTest(Activity.class)
public class MyTestCase extends TestCase {
public void testPlease_JustWork() throws Exception {
Activity mockActivity = PowerMockito.mock(Activity.class);
PowerMockito.when(mockActivity.getTitle()).thenReturn("Title");
}
}
我认为RuntimeException不会再出现,并且会返回“Title”,但它仍会抛出异常。
我尝试过各种不同的事情,例如doReturn("Title").when(mockActivity).getTitle();
和suppress(constructor(Activity.class));
我做错了什么或者这是不可能的?
答案 0 :(得分:5)
可能不是您问题的直接答案,但您可以尝试使用Robolectric来测试PC上部分Android应用。
Roboelectric避开了Stub!异常并为您提供一些最小的 Android类实现
答案 1 :(得分:2)
我认为答案是你引用的库的顺序很重要,因为android.jar包含了一些junit的存根。
您必须确保在测试项目中,如果您转到“属性”,然后转到“Java构建路径”,那么与您下载的完整版powermock相关联的junit jar将显示在“订购和导出”选项卡上上面 android.jar。如果没有,系统会从android.jar中解析junit.framework和junit.runner软件包,然后再将它们从powermock中包含的junit.jar中解析出来。
我意识到这个问题已经过时了,但我认为这是正确的答案,所以我想确保在问题上记录下来。
答案 2 :(得分:0)
我刚试过你的代码示例,它在这里工作,很奇怪。我用Mockito和JUnit下载了PowerMock 1.4.5,包括依赖项,并使用了sdk(2.2)中的android.jar。如果我删除了@PrepareForTest,它只会失败。
修改
您可以将android.jar与已删除的异常代码一起使用,在您引用的文章中提供。