java mock 工具

1. mock对象

一个测试例子:
java mock 工具_第1张图片

为了测试 类A, 有 以下方案:
方案1: 把整个依赖树构建出来,也就是BCDE的实例
但是, 当 类 B,C,D,E一个或多个未开发完成时或者 想让 A,B,C三个类隔离开来,如何测试类A呢? 此时可以考虑下面的方案。
方案2: 使用mock
java mock 工具_第2张图片

2. mock 关键点

关键点 描述

Stubbing (桩)

通常它可以用来提供那些测试所需的公共属性(像getters和setters)和公共方法。

返回一个特殊的值,抛出一个错误或者触发一个事件,此外,你可能希望指出方法被调用时的不同行为(即通过传递匹配的类型或者参数给方法)。


许多mocking框架的一个重要功能就是你不需要提供stub 的实体方法,也不用在执行测试期间stub那些未被调用的方法或者未使用的属性。
设置预期 设置预期结果:要求一个特定的函数被准确的调用3次,或不被调用,或调用至少两次但不超过5次,或者需要满足特定类型的参数、特定值和以上任意的组合的调用。


验证预期结果 首先你设定好预期结果,然后去验证你的预期结果是否正确。

3. mock好处

好处 描述
开发前创建测试; TDD(测试驱动开发)
如果你创建了一个Mock那么你就可以在service接口创建之前写Service Tests了,这样你就能在开发过程中把测试添加到你的自动化测试环境中了。换句话说,模拟使你能够使用测试驱动开发。

例如:依赖的系统尚未开发完成时
并行工作
开发测试并行
 隔离系统
在没有系统其他部分的影响下测试系统单独的一部分。


为无法访问的资源编写测试 
当你想要测试一个service接口,但service需要经过防火墙访问,防火墙不能为你打开或者你需要认证才能访问。遇到这样情况时,你可以在你能访问的地方使用MockService替代,这就是一个“救生圈”功能。 
Mock 可以交给用户
  在有些情况下,某种原因你需要允许一些外部来源访问你的测试系统,像合作伙伴或者客户。这些原因导致别人也可以访问你的敏感信息,而你或许只是想允许访问部分测试环境。在这种情况下,如何向合作伙伴或者客户提供一个测试系统来开发或者做测试呢?最简单的就是提供一个mock,无论是来自于你的网络或者客户的网络。soapUI mock非常容易配置,他可以运行在soapUI或者作为一个war包发布到你的java服务器里面。 
创建一个验证或者演示程序
 由于Mocks非常高效,Mocks可以用来创建一个概念证明,作为一个示意图,或者作为一个你正考虑构建项目的演示程序。这为你决定项目接下来是否要进行提供了有力的基础,但最重要的还是提供了实际的设计决策。

4.  java mock工具对比


feature EasyMock jMock Mockito Unitils Mock PowerMock:
EasyMock 
API
PowerMock:
Mockito
 API
JMock
it
Invocation count constraints  
Recording strict expectations      
Explicit verification      
Partial mocking  
No method call to switch from record to replay      
No extra code for implicit verification     N/A N/A   N/A
No extra "prepare for test" code    
No need to use @RunWith annotation or base
 test class
     
Consistent syntax between void and non-void methods        
Argument matchers for some parameters only, 
not all
         
Easier argument matching based on properties 
of value objects
 
Cascading mocks      
Support for mocking multiple interfaces        
Support for mocking annotation types    
Partially ordered expectations          
Mocking of constructors and final/static/native/private methods        
Declarative application of mocks/stubs to 
whole test classes
       
Auto-injection of mocks      
Mocking of "new-ed" objects        
Support for mocking enum types        
Declarative mocks for the test class (mock 
fields)
   
Declarative mocks for test methods
 (parameters, local fields)
           
Special fields for "any" argument matching            
Use of an special field to specify invocation
 results
           
Use of special fields to specify invocation
 count constraints
           
Expectations with custom error messages            
On-demand mocking of unspecified implementation classes            
Capture of instances created by code under
 test
           
Recording & verification of expectations in
 loops
           
Support for covariant return types            
"Duck typing" mocks for state-based tests            
Single jar file in the classpath is sufficient to
 use mocking API
      N/A N/A
Total 6/32 7/32 13/31 11/31 9/31 14/30 32/32
Total when ignoring JMockit-only features 6/22 7/22 13/21 11/21 9/21 14/20 22/22

5. Mockito


相对于EasyMock, Mockito的功能更多,Mockito的语法很自然(而EashMock之类的什么record,play模型显得有点多余)。Mockito的所有功能都在Mockito这个类中,里面的函数按功能可分为几类:
1. 参数匹配 — 就是Matchers里的那些any开头的函数
2. Mock
3. 打桩(stub)功能 — 就是那些do什么开头的函数
4. 验证模型, 包括atLeast,atLeastOnce,atMost,only,times等

注: easymock 学习
http://www.yiibai.com/easymock/

参考

http://blog.csdn.net/yasi_xi/article/details/24642517
http://liuzhijun.iteye.com/blog/1512780
http://blog.csdn.net/dc_726/article/details/8713236
http://www.oschina.net/translate/mockito-a-great-mock-framework-for-java-development

你可能感兴趣的:(java mock 工具)