在Android中模拟静态函数

时间:2013-02-05 08:50:59

标签: android mocking mockito

有没有办法可以使用任何Mocking Framework在Android中模拟静态函数。 Mockito可以模拟类,但是模拟静态函数是不够的。

任何帮助都将受到高度赞赏。

先谢谢

2 个答案:

答案 0 :(得分:2)

使用面向对象,继承等概念进行模拟工作....

基本上通过覆盖某些方法&在看起来像真实对象的对象/实例中的行为,因为它们是这些真实对象的子类。

换句话说,模拟部分包含在实例上的重写方法。

无法覆盖静态方法(afaik)。

因此,模拟静态调用并不容易(如果可能的话)。


编辑 - 我错了......

事实证明,我在上述陈述中错误地认为这是不可能的。

我应该在本网站上搜索重复的问题。请参阅下文,了解在某些情况下声称为您执行此操作的框架的一些链接。由于它们使用字节码,我不确定它们是否能在Android(ymmv)上正常工作。


(感谢Rohit强迫我重新评估我的信仰)

答案 1 :(得分:0)

请尝试以下操作:https://bintray.com/linkedin/maven/dexmaker-mockito-inline-extended

它可以帮助我成功模拟Android Instrumented Tests中的静态方法,但请注意,此功能需要在具有至少Android P 的设备上运行。

这是我所做的:

  • androidTestImplementation 'org.mockito:mockito-android:2.28.0'替换为androidTestImplementation 'com.linkedin.dexmaker:dexmaker-mockito-inline-extended:2.28.0'

  • 然后像这样模拟静态方法:

    static class StaticTrojan {
        static String staticOpen() { return "horse"; }
    }
    
    @Test
    public void testStubbingStaticMethod() {
        MockitoSession session = mockitoSession().spyStatic(StaticTrojan.class).startMocking();
        try {
            when(StaticTrojan.staticOpen()).thenReturn("soldiers");
            assertEquals("soldiers", StaticTrojan.staticOpen());
        } finally {
            session.finishMocking();
        }
    
        // Once the session is finished, all stubbings are reset
        assertEquals("horse", StaticTrojan.staticOpen());
    }