代码之家  ›  专栏  ›  技术社区  ›  bytebender

尝试使用powermockito抛出runtimeexception“stub!来截取android活动类!“

  •  9
  • bytebender  · 技术社区  · 14 年前

    我找到这个了 example 在那里,他们使用powermock和easymock来截取/模拟Android的菜单和菜单项类。我一直在尝试用PowerMock和Mockito在活动类中做类似的事情。

    我知道很多方法都是最终的,在android.jar中,它们都只是抛出runtimeexception(“stub!”).

    我也理解这个测试并不完整,但我只是想看看是否有可能模拟Android活动类。

    但是考虑到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 回复  |  直到 7 年前
        1
  •  0
  •   Maik    14 年前

    我刚试过你的代码样本,它在这里工作,很奇怪。我下载了带有mockito和junit的powermock 1.4.5,包括依赖项,并使用了sdk(2.2)中的android.jar。只有删除@PrepareForTest时才会失败,但有例外。

    编辑

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

        2
  •  5
  •   Tima    7 年前

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

    机器人避免了存根!例外,给你一些 最小 Android类实现

        3
  •  2
  •   Nick Campion    13 年前

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

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

    我知道这个问题很古老,但我认为这是正确的答案,所以我想确保把它记录在这个问题上。