android – 你如何投射RuntimeEnvironment.application?
作者:互联网
运行Robolectric测试时,RuntimeEnvironment.application的类型由您的配置决定.假设我将RoboApplication.class配置为我的测试应用程序,我可以将RuntimeEnvironment.application强制转换为我的类型.
RoboApplication app = (RoboApplication) RuntimeEnvironment.application;
app.doSomething();
但是,一旦我整合了PowerMock,铸造线就会失败
java.lang.ClassCastException: RoboApplication cannot be cast to RoboApplication
我该如何解决这个问题?
解决方法:
这是一个问题,因为PowerMock和Robolectric由于使用了自己的类加载器而互不兼容.
尽管名称相同,但Class对象实际上并不相同:Robolectric和PowerMock都通过自定义类加载器加载测试来工作.这些类加载器更改了有问题的类,允许您替换静态/最终的Android系统类和方法[Robolectric]或所有静态/最终类[PowerMock].这是PowerMock和Robolectric都依赖于拥有自己的JUnit4 Runner的部分原因:这样他们就可以从他们自己的修改类加载器加载适当的类.
因此,实例不能转换为其他类,即使它们具有相同的名称并且源自同一源文件:每个框架都可以更改类实现,因此它们不一定彼此兼容.
您需要选择一个框架或另一个框架:使用Robolectric shadows,可能直接使用EasyMock或Mockito,或使用PowerMock自行存取Android基础架构调用.
也可以看看:
> ClassCastException when casting to the same class
> cast across classloader?
标签:powermockito,android,mockito,robolectric,powermock 来源: https://codeday.me/bug/20190829/1761448.html