Robolectric和Powermock之间的类加载冲突

Dav*_*iño 5 powermock robolectric

我正在尝试编写一个需要Robolectric 2.2和PowerMock的测试,因为测试中的代码依赖于一些Android库和第三方库以及我需要模拟的最终类.

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

@RunWith(RobolectricTestRunner.class)
Run Code Online (Sandbox Code Playgroud)

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

我根据本指南设置了所有内容,但是我遇到了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
Run Code Online (Sandbox Code Playgroud)

我甚至试图修改javaagent库jar以完全删除那里的org.objectew.asm类,但由于org.objectweb.asm包中只需要运送其他类所需的ClassNotFoundException,因此无效在javaagent库jar中,而不是在asm中.

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

kol*_*aTM 0

我遇到了同样的问题,虽然我没有解决这个问题,但我想分享我的方法,这消除了对 PowerMock 的需要(在我看来这始终是一件好事):我想模拟对

Fragment fooFragment = new FooFragment();
Run Code Online (Sandbox Code Playgroud)

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

public FragmentFactory fragmentFactory = new FragmentFactory();
[...]
Fragment fooFragment = fragmentFactory.getFooFragment();
Run Code Online (Sandbox Code Playgroud)

完成此操作后,我可以使用标准 Mockito 模拟工厂,如下所示:

FragmentFactory mockFactory = mock(FragmentFactory.class);
activity.fragmentFactory = mockFactory;
when(mockFactory.getFooFragment()).thenReturn(mockFooFragment);
Run Code Online (Sandbox Code Playgroud)