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对象所属的