gpt4 book ai didi

powermock - Robolectric 和 Powermock 之间的类加载冲突

转载 作者:行者123 更新时间:2023-12-03 17:51:38 27 4
gpt4 key购买 nike

我正在尝试编写一个需要 的测试机器人电动 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 是一个接口(interface),而同一命名空间的 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 测试运行器一起正常工作。

最佳答案

我有同样的问题,虽然我没有解决这个问题,但我想分享我的方法,它消除了对 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);

关于powermock - Robolectric 和 Powermock 之间的类加载冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19998398/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com