5

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

鉴于我被迫通过以下方式使用 Robolectric 测试运行器:

@RunWith(RobolectricTestRunner.class)

...我不能使用 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

我什至尝试修改 javaagent 库 jar 以完全删除其中的 org.objectew.asm 类,但这不起作用,因为 ClassNotFoundException 之后发生,因为 org.objectweb.asm 包中需要一些其他类,只发货在 javaagent 库 jar 中,而不是在 asm 中。

有任何想法吗?根据那里的示例,该代理似乎至少可以与 Spring 测试运行器一起正常工作。

4

1 回答 1

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);
于 2014-01-28T20:26:07.053 回答