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

我find了这个例子 ,他们使用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”,但它仍然会抛出exception。

我尝试了各种不同的东西,比如doReturn("Title").when(mockActivity).getTitle();suppress(constructor(Activity.class));

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

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

编辑

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

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

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

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

您必须确保在您的测试项目中,如果您转到’属性’然后’Java Build Path’,那么与您下载的完整版powermock相关联的junit jar会显示在android 上方的’Order and Export’选项卡 。jar。 如果没有,系统会从android.jar中解析junit.framework和junit.runner软件包,然后再将它们从powermock中包含的junit.jar中解析出来。

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