关于easymock

作为一个月薪3000的屌丝民工,今天也开始写自己的微博了,打发一下dota之外的时光。接触编程一年了,写了一年的flex,虽然很是熟练,但是有啥用呢。新版flash的普及上不去,旧版的渲染太慢。还是改行好了。

今天下午看到了easymock。了解了他的使用方法后,很是惊奇,决定研究一下他的代码

Print qm=EasyMock.createMock(Print.class);
我先定义了一个Print类,然后用createMock方法生成

createMock()的源码是

public static <T> T createMock(final Class<T> toMock) {
        return createControl().createMock(toMock);
    }


createControl()方法生成了一个MocksControl对象

MocksControl中createMock()的实现是

public <T> T createMock(final String name, final Class<T> toMock, final ConstructorArgs constructorArgs,
            final Method... mockedMethods) {
        if (toMock.isInterface() && mockedMethods != null) {
            throw new IllegalArgumentException("Partial mocking doesn't make sense for interface");
        }


        try {
        //什么都没有做
            state.assertRecordState();
            final IProxyFactory proxyFactory = toMock.isInterface()
                    ? interfaceProxyFactory
                    : getClassProxyFactory();
//toMock是传入的类对象
            return proxyFactory.createProxy(toMock, new ObjectMethodsFilter(toMock,
                    new MockInvocationHandler(this), name), mockedMethods, constructorArgs);
        } catch (final RuntimeExceptionWrapper e) {
            throw (RuntimeException) e.getRuntimeException().fillInStackTrace();
        }
    }


这里面生成的关键是使用proxyFactory.createProxy来根据类生成对象。proxyFactory根据toMock的类型使用不同的子类,

toMock是接口的话,使用JavaProxyFactory,他通过java自带的反射机制类生成对象。

如果toMock不是接口,使用第三方jar包,如果是android的类(通过虚拟机来判断),则使用dexmarker这个jar包生成对象;

否则使用objenesis这个jar包来生成对象。

在生成对象的同时,我们还加入了一个方法MockInvocationHandler;

它保证了在调用了这个对象的方法后,将当前的MocksControl对象设置为这个对象专用的MocksControl对象。

qm.printHello(strgetter);
EasyMock.expectLastCall().andReturn("nihao3").times(2);
这就是为什么每次调用expectLastCall()时,能够顺利的操作他这个qm对应的MocksControl对象。

一个被生成的对象有一个专用的MocksControl对象来,来维护这个被生成对象的相关操作。

当前MocksControl的设置是通过LastControl.reportLastControl()来进行操作的。

他将MocksControl存储在ThreadLocal中,ThreadLocal不是一个被我们经常使用的弱类型的数据存储(类似map)。暂时还不明白这样设计的巧妙之处。

LastControl.lastControl()方法则是获取当前的MocksControl对象

今天看到这里,打算明天继续看看。全当作java的入门学习


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值