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

今天遇到一个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都在子类即可。
看了此篇文章是不是感觉收获蛮大

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: org.powermock.api.mockito.classnotpreparedexception是一个异常,表示在使用PowerMockito进行Mockito测试时,Mockito无法准备被Mock的类。这可能是因为被Mock的类没有被正确地加载或准备,或者PowerMockito没有正确地配置。要解决这个问题,可以尝试重新加载被Mock的类,或者检查PowerMockito的配置是否正确。 ### 回答2: org.powermock.api.mockito.ClassNotPreparedExceptionPowerMockMockito使用中常见的一个异常。它通常在我们试图使用PowerMockito类来mock私有方法时抛出。 这个异常通常意味着我们可能忘记了一些重要的设置步骤。因此,要解决这个异常,我们需要检查以下几个方面: 1.是否在测试类上使用了@PrepareForTest注解?这个注解用于标记哪些类的私有方法可以被mock掉。如果注解中没有包含要mock的类,就会抛出ClassNotPreparedException异常。 2.是否在测试方法中正确地调用了PowerMockito.mockPrivate方法?这个方法用于mock私有方法。如果没有正确地使用它,也会抛出ClassNotPreparedException异常。 3.是否使用了正确的Mockito版本?因为Mockito在新版本中有重大的改动,所以如果我们使用的版本太旧或太新,可能会导致ClassNotPreparedException异常。 4.是否存在其他的冲突?如果我们在测试类或被测试的类中使用了其他的mock框架或字节码操纵库,也可能会导致ClassNotPreparedException异常。 除了以上的几点,我们还可以尝试在测试类或方法上增加@PowerMockIgnore注解,排除掉一些与PowerMock冲突的库,来解决这个异常。总之,要解决ClassNotPreparedException异常,我们需要详细地检查代码和框架设置,以找到可能的问题点并解决它们。 ### 回答3: org.powermock.api.mockito.classnotpreparedexception是一个由PowerMockMockito框架一起使用时可能会遇到的异常。 Mockito是Java中广泛使用的一个单元测试框架,主要用于创建和模拟对象以进行测试。PowerMock是一个增强型的Mockito框架,可以扩展Mockito的功能,提供静态方法和构造函数的模拟等功能。当使用PowerMockMockito框架时,如果没有正确配置Mockito和PowerMockito运行器,并且在测试代码中使用了PowerMockito的功能,就可能会抛出org.powermock.api.mockito.classnotpreparedexception异常。 该异常通常是由于Mockito和PowerMockito的配置出现问题导致的。解决此问题的方法是必须确保在测试类上使用了正确的运行器,并且在测试方法中正确使用了PowerMockito的API。具体来说,有以下建议: 1.确保在测试类的顶部使用了正确的运行器注释。PowerMockito使用了自己的运行器,所以必须将其添加到运行器注释中。例如:@RunWith(PowerMockRunner.class) 2.确保在测试方法上使用了正确的运行器注释。PowerMockito使用了自己的运行器,所以必须将其添加到运行器注释中。例如:@RunWith(PowerMockRunner.class) 3.确保在测试方法中正确使用了PowerMockito的API。例如,使用@PrepareForTest注释来指定需要Mock的类或方法等。 4.如果使用了多个运行器,确保它们的配置正确。例如,如果同时使用Mockito和PowerMockito,则必须在运行器注释中使用@PowerMockRunnerDelegate(MockitoJUnitRunner.class)指定Mockito的运行器。 重要的是要了解PowerMockito需要更多的配置和细节,并要在正确的位置使用正确的运行器和注释来避免org.powermock.api.mockito.classnotpreparedexception异常。能够正确配置和使用PowerMockito,可以增强Mockito的功能,帮助我们轻松地编写单元测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值