踩坑PowerMock org.powermock.api.extension.listener.AnnotationEnabler 问题

本文深入探讨了PowerMock框架中使用@Spy和@InjectMocks注解时出现的一个bug,详细解释了错误产生的原因,并提供了避免该问题的有效策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天遇到一个powermock的问题:堆栈打印:org.powermock.api.extension.listener.AnnotationEnabler
debug到源代码发现为:
Argument should be a mock, but is:class …

代码如下:

public class MockTest extends BaseTest{

    @Spy
    @InjectMocks
    public A a = new A();

    @Test
    public void test() {
    // 运行此处报错
        Assert.assertTrue(a != null);
    }
}

class A {
    @Autowired
    private B b;
}

class B {

}
@RunWith(PowerMockRunner.class)
class BaseTest {

    @Spy
    @InjectMocks
    public B b = new B();

}

后来发现这是PowerMock框架的bug。https://github.com/mockito/mockito/issues/285,看了源代码发现是Spy类注入的依赖对象
在这里插入图片描述
此处应责任链模式去处理mock对象。
在这里插入图片描述
这里会给每个Spy对象@injectMocks依赖的对象给“注入”进去,这里判断isMock为false导致抛异常.
如果是子类@Spy对象要注入的对象是父类@Spy进去的。那就会使用这个 Marker :
在这里插入图片描述
得到对应的mock处理器,一定是要MockAccess。父类是没实现MockAccess。因此返回了null。导致出错。


结论:这个问题是powerMock一个bug,子类需要注入父类的 @Spy对象既会触发此BUG。最好约定,父类都只是mock对象。@spy都在子类即可。
看了此篇文章是不是感觉收获蛮大

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值