EasyMock源码分析

本文深入剖析了EasyMock的内部机制,包括MocksControl的type、state和behavior,动态代理的实现,以及expect()、andReturn()、times()方法的工作原理。EasyMock在创建mock对象时,会根据配置选择Java动态代理或CGLIB进行实现。在调用mock对象方法时,Matchers被保存在ThreadLocal中,随后通过times()确定调用次数。源码分析揭示了unorderedBehavior列表如何存储无序行为,以及在验证时如何确保行为的正确顺序。
摘要由CSDN通过智能技术生成
MocksControl有type ,state 和 behavior。它会被保存在当前Thread对应的Map的以threadLocal
为键的值中。
初始化MocksControl时,根据type来设定behavior的checkorder,并使用当前的behavoir初始化state,并清空一下当前Thread的Map中的MocksControl
MocksControl 负责创建代理,检查easymock.properties,是否支持类的mock的配置,如果是mock接口,使用的是java的动态代理,如果是mock类,使用的是cglib和objenesis来实现。
先分析动态代理,首先调用参数的模拟方法,如EasyMock.anyInt()和EasyMock.anyDouble(),该方法会将之前的所有Matcher保存到当前Thread的Stack中(ThreadLocal)。
随后调用动态代理的方法,该方法首先会被ObjectMethodsFilter过滤掉equals toString  等方法,改为一种默认实现。随后将创建该mock对象的Mockscontrol保存到当前Thread中。最后调用reportState的invoke方法,该方法将先前保存的所有Matcher拿出来和Invocation一起被封装成一个ExpectedInvocation,顾名思义Invocation记录了当前方法的调用信息,包括了mock对象,方法,以及方法的所有参数,其中主要用的就是method。
好了,接下来就是EasyMock.expect()方法了,该方法很简单,返回调用mock对象方法时保存在thread中的MocksControl对象,也就是刚刚执行方法的mock对象所属的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值