PowerMockRule踩坑

2020-09-27  本文已影响0人  普通的程序员

进行过单测的都知道,
使用Mockito2.*版本的时候,会需要借助PowerMockito的mock static等功能。

然后又因为需要mock Android环境,就又加上了robolectric的运行器。

而恰巧这里有一个小兼容性问题。

比如我们进行单测时,

一个单测用例的生命周期是

@before ---> @Test --->@after

又因为before修饰的函数会每一次都运行,第一次运行又属其中最耗时的,

这个时候我们的解决方案往往是,提取耗时操作到 @beforeclass

@beforeClass的执行 是 早于 @before,且执行一次的。

那我们可以做一个init singleton 初始化单例的方式,在beforeClass里进行调用。

以上看似没有问题。

但是一旦加入了

@Rule
PowerMockRule

可能会出现NPE的问题。

原因是

robolectric 在运行到@beforeClass的时候,运行器的classLoader还是 AndroidSandBoxClassLoader

由于PowerMockRule的存在

会导致@before,@Test等方法,都是运行在 javaAssistClassLoader里


有兴趣的可以单步跟进

两个不同的classLoader,以至于设想的BeforeClass里init 单例的方案无法实现。

如果不需要使用robolectric ,或者不需要使用Powermock,该方案work。

上一篇 下一篇

猜你喜欢

热点阅读