Robolectric和Powermock之间的类加载冲突

时间:2013-11-15 10:03:18

标签: powermock robolectric

我正在尝试编写一个需要 Robolectric 2.2和 PowerMock 的测试,因为测试中的代码依赖于某些Android库和带有最终类的第三方库我需要嘲笑。

鉴于我被迫使用Robolectric测试跑者:

@RunWith(RobolectricTestRunner.class)

...我无法使用PowerMock测试运行器,因此我尝试使用PowerMock java代理替代方案,目前为止没有运气。

我根据this guide设置了所有内容但是我遇到了javaagent库所需的类与robolectric之间的碰撞问题,因为它依赖于asm-1.4。两者都取决于

  

org.objectweb.asm.ClassVisitor

,但是javaagent-1.5.1附带了自己的版本,其中ClassVisitor是一个接口,而同一命名空间的asm-1.4版本是一个抽象类,在运行时有相应的错误:

java.lang.IncompatibleClassChangeError: class org.objectweb.asm.tree.ClassNode has interface org.objectweb.asm.ClassVisitor as super class

我甚至试图修改javaagent库jar以完全删除那里的org.objectew.asm类,但由于org.objectweb.asm包中需要一些其他类,因此之后发生ClassNotFoundException不起作用只发布在javaagent库jar中,而不是asm中。

有什么想法吗?根据示例,代理似乎与至少Spring测试运行器一起正常工作。

1 个答案:

答案 0 :(得分:0)

我有同样的问题,虽然我没有解决这个问题,但我想分享我的方法,这就消除了对PowerMock的需求(在我看来这总是一件好事):我想嘲笑一个致电

Fragment fooFragment = new FooFragment();

所以我所做的是增加另一个间接级别。我创建了一个FragmentProvider类:

public FragmentFactory fragmentFactory = new FragmentFactory();
[...]
Fragment fooFragment = fragmentFactory.getFooFragment();

在我这样做之后,我可以用标准的Mockito模仿工厂,就像这样:

FragmentFactory mockFactory = mock(FragmentFactory.class);
activity.fragmentFactory = mockFactory;
when(mockFactory.getFooFragment()).thenReturn(mockFooFragment);