PowerMockRule踩坑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PowerMockRule踩坑相关的知识,希望对你有一定的参考价值。

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

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

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

比如我们进行单测时,

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

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

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

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

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

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

以上看似没有问题。

但是一旦加入了

可能会出现NPE的问题。

原因是

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

由于PowerMockRule的存在

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

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

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

以上是关于PowerMockRule踩坑的主要内容,如果未能解决你的问题,请参考以下文章

配置同时使用PowerMock和Robolectric对Android进行单元测试

无法在 Spring Boot 项目中使用 SpringJUnit4ClassRunner 运行 powermockrule

单元测试-PowerMock

PowerMock框架讲解及使用

powermock mock静态方法为啥会执行

PowerMock