部分mock(partial mock)

部分mock是说一个类的方法有些是实际调用,有些是使用mockito的stubbing(桩实现)。

为什么需要部分mock

当需要测试一个组合方法(一个方法需要其它多个方法协作)的时候,某个叶子方法(只供别人调用,自己不依赖其它反复)已经被测试过,我们其实不需要再次测试这个叶子方法,so,让叶子打桩实现返回结果,上层方法实际调用并测试。

mockito实现部分mock的两种方式:spy和callRealMethod()

spy的原理是,如果不打桩默认都会执行真实的方法,如果打桩则返回桩实现。可以看出spy.size()通过桩实现返回了值100,而spy.get(0)则返回了实际值

List<String> list = new LinkedList<String>();  
List<String> spy = spy(list);  
when(spy.size()).thenReturn(100);  
spy.add("one");  
spy.add("two");  
assertEquals(spy.get(0), "one");  
assertEquals(100, spy.size());

Channel channel = mock(Channel.class);
when(channel.writeAndFlush(obj)).thenReturn(null);

一、什么是mock测试,什么是mock对象? 

一种替代方案就是使用mocks

 

从图中可以清晰的看出

mock对象就是在调试期间用来作为真实对象的替代品。

mock测试就是在测试过程中,对那些不容易构建的对象用一个虚拟对象来代替测试的方法就叫mock测试。

知道什么是mock测试后,那么我们就来认识一下mock框架—Mockito

 

二、什么是Mockito

除了有一个好记的名字外,Mockito尝试用不一样的方法做mocking测试,是简单轻量级能够替代EasyMock的框架。使用简单,测试代码可读性高,丰富的文档包含在javadoc中,直接在IDE中可查看文档,实例,说明。更多信息:http://code.google.com/p/mockito/

 

三、Stub和Mock

相同点:Stub和Mock对象都是用来模拟外部依赖,使我们能控制。

不同点:而stub完全是模拟一个外部依赖,用来提供测试时所需要的测试数据。而mock对象用来判断测试是否能通过,也就是用来验证测试中依赖对象间的交互能否达到预期。在mocking框架中mock对象可以同时作为stub和mock对象使用,两者并没有严格区别。 更多信息:http://martinfowler.com/articles/mocksArentStubs.html

 

四、mockito入门实例

Maven依赖:(没用maven管理的可以下载相关jar包导入classpath)

 

  <embed src="http://liuzhijun.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" type="application/x-shockwave-flash" width="14" height="15">
  </embed> 
  
  <a title="收藏这段代码"><img class="star" src="http://liuzhijun.iteye.com/images/icon_star.png" alt="收藏代码" /></a>

 

  <embed src="http://liuzhijun.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" type="application/x-shockwave-flash" width="14" height="15">
  </embed> 
  
  <a title="收藏这段代码"><img class="star" src="http://liuzhijun.iteye.com/images/icon_star.png" alt="收藏代码" /></a>

好了,五分钟差不多了,还想继续了解那就可以往下面看

 

创建mock对象不能对final,Anonymous ,primitive类进行mock。

 

可对方法设定返回异常

 

  <embed src="http://liuzhijun.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" type="application/x-shockwave-flash" width="14" height="15">
  </embed> 
  
  <a title="收藏这段代码"><img class="star" src="http://liuzhijun.iteye.com/images/icon_star.png" alt="收藏代码" /></a>

 

stubbing另一种语法(设置预期值的方法),可读性不如前者

  <embed src="http://liuzhijun.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" type="application/x-shockwave-flash" width="14" height="15">
  </embed> 
  
  <a title="收藏这段代码"><img class="star" src="http://liuzhijun.iteye.com/images/icon_star.png" alt="收藏代码" /></a>

没有返回值的void方法与其设定(支持迭代风格,第一次调用donothing,第二次dothrow抛出runtime异常)

  <embed src="http://liuzhijun.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" type="application/x-shockwave-flash" width="14" height="15">
  </embed> 
  
  <a title="收藏这段代码"><img class="star" src="http://liuzhijun.iteye.com/images/icon_star.png" alt="收藏代码" /></a>

 

五、参数匹配器(Argument Matcher)

Matchers类内加你有很多参数匹配器  anyInt、anyString、anyMap…..Mockito类继承于Matchers,Stubbing时使用内建参数匹配器,下例:

 

  <embed src="http://liuzhijun.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" type="application/x-shockwave-flash" width="14" height="15">
  </embed> 
  
  <a title="收藏这段代码"><img class="star" src="http://liuzhijun.iteye.com/images/icon_star.png" alt="收藏代码" /></a>

 

需要注意的是:如果使用参数匹配器,那么所有的参数都要使用参数匹配器,不管是stubbing还是verify的时候都一样。

 

  <embed src="http://liuzhijun.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" type="application/x-shockwave-flash" width="14" height="15">
  </embed> 
  
  <a title="收藏这段代码"><img class="star" src="http://liuzhijun.iteye.com/images/icon_star.png" alt="收藏代码" /></a>

 

六、方法调用的验证(具体的调用次数、至少一次,一次也没有)

 

  <embed src="http://liuzhijun.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" type="application/x-shockwave-flash" width="14" height="15">
  </embed> 
  
  <a title="收藏这段代码"><img class="star" src="http://liuzhijun.iteye.com/images/icon_star.png" alt="收藏代码" /></a>

 

 

一次写不完,慢慢分析。。。

参考:

http://mockito.googlecode.com/svn/branches/1.6/javadoc/org/mockito/Mockito.html

http://www.sizovpoint.com/2009/03/java-mock-frameworks-comparison.html

http://wenku.baidu.com/view/8def451a227916888486d73f.html

http://qiuguo0205.iteye.com/blog/1443344

 

http://bijian1013.iteye.com/blog/1986068

http://blog.csdn.net/onlyqi/article/details/6396646

http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html

 

ockito是一种mock工具/框架。我理解EasyMock有点过时了,Mockito是现在比较流行的。

什么是mock?说的直白一点,大家都知道unit test应该是尽可能独立的。对一个class的unit test不应该再和其他class有任何交互。

现在有一个类,扫描一个目录并将找到的文件都上传到FTP server。该类对于不同的FTP响应(找不到FTP server 或 上传成功,或上传失败),有一些后续操作。

在写这个类的UT时,我们就必须虚构出来一个FTP对象。这样在UT中,这个虚构的对象能够代替真正的FTP,对被测试类的调用做出一定的响应。从而知道被测试类是否正确的调用了FTP并做出一些正确的期望的响应。从而达到测试的目的。

mock可以模拟各种各样的对象,从而代替真正的对象做出希望的响应。

关于mock的概念和EasyMock,可以参考:

Mock object and EasyMock framework

http://blog.csdn.net/OnlyQi/archive/2011/04/26/6364885.aspx

 

官网:http://mockito.org/

一篇很好的入门文章:

http://blog.csdn.net/huoshuxiao/archive/2010/12/30/6107835.aspx

一些稍微复杂且实用一点的例子:

http://gojko.net/2009/10/23/mockito-in-six-easy-examples/

http://liuzhijun.iteye.com/blog/1512780