java mock 工具

来源:互联网 发布:刷单淘宝老号在哪里买 编辑:程序博客网 时间:2024/06/10 20:06

1. mock对象

一个测试例子:


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

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工具对比


featureEasyMockjMockMockitoUnitils MockPowerMock:
EasyMock 
APIPowerMock:
Mockito
 APIJMock
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/AN/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/AN/ATotal6/327/3213/3111/319/3114/3032/32Total when ignoring JMockit-only features6/227/2213/2111/219/2114/2022/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
0 0