进行过单测的都知道,
使用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。
网友评论