关于easy的短语(facemock框架)

作为一个月薪3000的屌丝民工,今天也开始写自己的微博了,打发一下dota之外的时光。写了一年的flex,虽然很是熟练,但是有啥用呢。新版flash的普及上不去,旧版的渲染太慢。还是改行好了。最近开始研究有啥好的东西,之前看了一下unity3d,但是发现自己得先去学3dmax,可是看了3dmax发现高手实在太多了。要学好也不知道要多久,况且自己的美术功底实在太差。专研一下后台吧,发现自己编码解码不

大家好,又见面了,我是你们的朋友全栈君。

作为一个月薪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的入门学习

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/128555.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • linux时间戳转换成时间指令_时间戳转换公式

    linux时间戳转换成时间指令_时间戳转换公式原文地址:http://wanping.blogbus.com/logs/28663569.html1、时间戳转换为正常显示的时间格式Freebsd系统下:转换命令为:date-r1112173761    或者:date-r1112173761+”%Y-%m-%d%T%z”(年月日的格式不一样)Linux系统下:转换

  • Vs下 CCriticalSection::Lock 异常错误的发生「建议收藏」

    Vs下 CCriticalSection::Lock 异常错误的发生「建议收藏」自己在vs下写了一个用 CCriticalSection::Lock来锁定对象的程序,发现给Lock设置dword参数时总会出现异常,后来查看了一下函数的文档,才恍然大悟!!!CCriticalSection类包含成员函数锁定的线程可用于获得一个关键部分对象的所有权。有两个版本的锁定功能没有参数和其他采用DWORD参数之一。后一种版本的锁定文档状态dword值参数指定

  • Linux 之 zsh

    Linux 之 zsh安装现在好多linux发行版好像都自带zsh的,比如说centos。[root@master~]#chsh-l/bin/sh/bin/bash/usr/bin/sh/usr/bin/bash/usr/bin/tmux/bin/zsh/usr/bin/fish如果实在没有的话,就用yum安装一个。yuminstallzsh…

  • 自动化运维平台(后端python+django)「建议收藏」

    自动化运维平台(后端python+django)「建议收藏」Django的MTV模式Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是值:M代表模型(Model):负责业务对象和数据库的关系映射(ORM)。T代表模板(Template):负责如何把页面展示给用户(html)。V代表视图(View):负责业务逻辑,并在适当时候调用Model和Tem…

  • Intel参数_intel g系列

    Intel参数_intel g系列http://www.intel.com/support/cn/mt/mt_win.htm

    2022年10月29日
  • 通用高级模组修改器(魔兽世界改模型插件)

    准备工作:所需软件WINHEX,百度一下就有,华军什么的也可以。还有就是反向十六进制代码转换器。另外还需要一个代码查询网站http://wow.allakhazam.com/。打开网站点“search”。然后将语言选择为中文,输入要查询的装备的名称查询。然后点所需装备的连接,在出现的网页中点XML。拖动网页,会看见一片数字,其他的不管,只需要2个displayinfo中间的数字,例如,逐风剑的就是…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号