使用PowerMockito尝试存根android活动类会抛出RuntimeException“Stub!”

时间:2010-09-17 23:35:07

标签: android unit-testing junit mockito powermock

我发现这个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));

我做错了什么或者这是不可能的?

3 个答案:

答案 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与已删除的异常代码一起使用,在您引用的文章中提供。