Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中模拟静态函数_Android_Mocking_Mockito - Fatal编程技术网

在Android中模拟静态函数

在Android中模拟静态函数,android,mocking,mockito,Android,Mocking,Mockito,是否有任何方法可以使用任何模拟框架模拟Android中的静态功能。 Mockito可以模拟类,但对于模拟静态函数来说是不够的 我们将非常感谢您的帮助 提前感谢通过使用面向对象、继承等概念模拟作品 基本上,通过覆盖某些方法和行为,对象/实例看起来像真实对象,因为它们是这些真实对象的子类 换句话说,模拟部分在实例上重写方法 不可能重写静态方法(afaik) 因此,模拟静态调用并不容易(如果可能的话) 编辑-我错了。。。 事实证明,我的上述陈述是错误的,即这是不可能的 我应该在这个网站上搜索重复的问

是否有任何方法可以使用任何模拟框架模拟Android中的静态功能。 Mockito可以模拟类,但对于模拟静态函数来说是不够的

我们将非常感谢您的帮助


提前感谢

通过使用面向对象、继承等概念模拟作品

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

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

不可能重写静态方法(afaik)

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


编辑-我错了。。。 事实证明,我的上述陈述是错误的,即这是不可能的

我应该在这个网站上搜索重复的问题。请参阅下面的一些链接,这些链接指向声称在某些情况下可以为您这样做的框架。由于它们使用字节码,我不确定它们是否能在Android(ymmv)上正常工作


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

请尝试以下方法:

这有助于我在安卓指令测试中成功模拟静态方法,但请注意,此功能要求在至少带有安卓p的设备上运行

以下是我所做的:

  • androidTestImplementation'org.mockito:mockito android:2.28.0'
    替换为
    androidTestImplementation'com.linkedin.dexmaker:dexmaker-mockito内联扩展: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());
    }
    

  • 当然,你首先要考虑的是,如果你能移除静态调用…我认为解决这个问题比编写非静态代码要困难得多,所以您能告诉我哪个框架将指导我编写静态函数的模拟调用吗?但我能够使用PowerMockito和Mockito模拟Java项目中的静态函数。但我不能在Android项目中这样做。我添加了dexmaker,mockito,它可以在Android中很好地工作。但是PowerMockito libs似乎工作不好。