有没有办法可以使用任何Mocking Framework在Android中模拟静态函数。 Mockito可以模拟类,但是模拟静态函数是不够的。
任何帮助都将受到高度赞赏。
先谢谢
答案 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());
}