日记 - mock的简单使用方式

环境:win7 jdk1.6 java

架构:idea maven springMVC

 

    mock是与搭配junit使用的一款工具软件。mock的中文意思就是模拟和假装的意思,实际上mock就是由我们虚拟一段数据,然后通过@Mock注入来帮助测试。 大家可能会想测试嘛,数据肯定是虚拟出一段来测试,干嘛要这么麻烦的用这个工具。关于这个问题我也思考过一段时间。 首先它是辅助测试的,而测试的最高目标是保证我们的代码符合我们的期望,请谨记,一个能work的功能未必是我们最初的期望。功能是在提出需求时,进过商讨而有取舍的选择得来的,既然是经过取舍的,那么它就不是最标准符合期望的。那么测试就是让我们确信我们的取舍是符合需求的。 那么怎么样的测试才能够满足需求呢。那就是屏弃实现,完全从程序设计角度出发的测试。也就是TDD(测试驱动开发)。

    例如:我要发送邮件,那么在我还未实现邮件发送功能前,我要如何写测试呢?

              MailSender.sendEmail(message);

    上述代码就是我的发送邮件功能,它怎么来的?

    首先,MailSender“邮件发送者”,这是这个类的名字也是他的功能设计类就是要根据我需要的功能来设计,这是我给这个类的定义,在我写上述代码前,这个类还不存在,但是现在我通过上面我设计好的这个名字,就去工程里新建一个这个名字的类出来! 同样的,sendEmail(message)这个方法也没有,现在我就去写一个这个方法,当然方法里面是空的。至于这个message的类型我也不管,我先放一个object(object在手天下我有)。

    sendEmail明显就是发送邮件了,那么这个方法就是发送邮件用的,那么我以后只要将发送功能在这个方法内完成即可,这样就能完全保证我的功能实现是按照我测试时的需求来进行的,也就不会出现大的偏差,哪怕小的偏差也很难有。

    那么为什么要传一个message呢?其实无关功能,在我们做面向对象设计的时候就该有概念,sendEmail()只是发送Email,那么是发送什么Email呢?总得有内容吧。那么message就是内容,至于这个message是什么类型的,我们不需要关心它,因为从对象设计上来说,这样是正确的。

    接下来就要说到mock了。我们测试就是测试写出来的功能,但是功能里面的数据是由最初传进去,然后在我们看不到的地方运行的,而mock可以通过aop的方式在功能内部确切的地方注入一段虚假的数据。为什么我要如此强调虚假的数据?因为要多方面测试一个功能的时候就要测试该功能的边界,这个边界是满足于我们需求的,也就是说mock虚拟数据是以需求的边界为基准的,然后将该数据注入到我们的功能里跑,最后看结果是否符合期望。这就是一个很好的测试。

    好了,接下来就是肉戏了。在maven里用下段代码 


注入mock,接下来是如何使用mock,很简单,看看就能懂



 这里声明私有属性,然后通过下面这段代码的before来为上面的属性注入实例对象



 mock就是上面红框内的代码,不要问我这API什么意思怎么用,这方法的命名已经很清晰明了了,看不懂英文去翻译一下。

 

    上面大段的文字解说,到肉戏的时候却这么简短,这是为什么?

    在用一个工具前,最好了解一下它是在什么样的需求下诞生的,因为这个需求有可能是那个时代最迫切的需求。它代表一种走向,一种潮流!用mock可以贴合我们的逻辑,贴合我们的设计去走完一个测试。工具是不能测试的,只有我们的逻辑才能进行测试,而工具仅仅需要能够贴合我们的设计逻辑就可以了。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值