9

我发现了这个例子,他们使用 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));

我做错了什么还是这不可能?

4

3 回答 3

5

可能不是您问题的直接答案,但您可以尝试Robolectric以在您的 PC 上测试部分 Android 应用程序。

Roboelectric 避免了 Stub!异常并为您提供一些最小的Android 类实现

于 2011-09-07T07:46:55.147 回答
2

我认为答案是您引用的库的顺序很重要,因为 android.jar 包含一些用于 junit 的存根。

您必须确保在您的测试项目中,如果您转到“属性”,然后转到“Java 构建路径”,则与您下载的完整版 powermock 关联的 junit jar 显示在 android上方的“订购和导出”选项卡上。罐。如果没有,系统会先从 android.jar 解析 junit.framework 和 junit.runner 包,然后再从 powermock 中包含的 junit.jar 解析它们。

我意识到这个问题很老,但我认为这是正确的答案,所以我想确保在这个问题上记录下来。

于 2011-10-17T18:37:57.010 回答
0

我刚刚尝试了您的代码示例,它在这里工作,奇怪。我下载了带有 Mockito 和 JUnit 的 PowerMock 1.4.5,包括依赖项,并使用了 sdk (2.2) 中的 android.jar。如果我删除@PrepareForTest,它只会失败并出现异常。

编辑

您可以将 android.jar 与您引用的文章中提供的已删除异常代码一起使用。

于 2010-09-27T22:36:24.677 回答