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