在实际编写 unit test 的过程中,很多情况下我们会需要使用其他的组件(如和数据库相关的测试)。当我们是使用第三方提供的组件时,这并不是太大的问题,因为我们可以假设他们是无错的。但是一旦这些组件是我们自己的组件时,问题就暴露出来了。
“单元测试出错了,但到底是谁的错。我的?他的?”,这种情况显然违反了测试的独立性原则 。出现这种情况使得这个测试无法确切的指出是那个单元出现了问题,照成了排错的困难,而且也浪费了时间。同时,过分的将单元的测试代码依赖于其他单元,也照成了其他一些很现实的问题:
- 在所依赖的单元完成之前,无法顺利的编写单元测试。
- 产生环境的依赖性,如运行一个 HttpServletRequest 处理器的测试代码必须启动一个 servlet 容器。
所有这些问题,都可以使用 Mock Object 来解决。使用它的前提是,所依赖单元的接口必须定义清楚。而 EasyMock 正是为了这一目的而产生的。
使用目的
通过模拟 unit test 所需要的组件,已达到隔离各个 unit test 的目的。目前的版本 1.1 ,它所需要的环境是 jdk1.3.1 以上和 junit3.8.1 以上。
可以从 http://sourceforge.net/projects/easymock/ 处下载。
用法
1. EasyMock 采用“记录 ----- 回放”的工作模式,基本使用步骤:
- 创建 Mock 对象的控制对象 Control 。
- 从控制对象中获取所需要的 Mock 对象。
- 记录测试方法中所使用到的方法和返回值。
- 设置 Control 对象到“回放”模式。
- 进行测试。
- 在测试完毕后,确认 Mock 对象已经执行了刚才定义的所有操作。
2. 使用举例:假设需要测试的对象是 RequestUtil ,所需要测试的方法为 getBoolean 。此时我们需要模拟一个 HttpServletRequest 对象。
public void testGetStringHttpServletRequestString() {
public void testGetBoolean() {
// 创建 Mock 对象的控制器
MockControl control= MockControl.createControl( HttpServletRequest.class);
// 获取 Mock 对象
HttpServletRequest mock= (HttpServletRequest)control.getMock();
// 设置 getBoolean 中要使用的方法和返回值
control.expectAndReturn( mock.getParameter( "test"), null);
// 设置控制器为 replay 模式
control.replay();
// 执行测试
assertNull( RequestUtil.getString( mock, "test"));
// 确认
control.verify();
}
}
通过 EasyMock ,执行这段测试代码完全不需要启动一个 servlet 容器,在命令行的方式下即可完成,非常的方便。
3. 记录需要使用的 Mock 的行为。在使用一个 Mock 对象之前,需要设置我们要用到的方法,以及每个方法的返回值。对于那些没有设置的方法,一旦调用(控制器处于 replay 模式), EasyMock 就会抛出异常。记录一个方法,通常可以分成 2 步 :首先,如同使用正常对象调用这个方法;然后,使用控制器的 setReturnValue 函数设置即可。在 1.1 中,提供了 expectAndReturn 函数,使得 2 步可以合而为一。主要的函数大致如下:
- expectAndReturn ,设置期望调用的函数,以及返回值
- expectAndThrow ,设置期望调用的函数,同时期望该次调用抛出异常
- setReturnValue ,设置上一次调用的返回值(如上次调用时, request.getparameter( “test”) ,此处设置 request.getparameter( “test”) 的返回值)
- setThrowable ,设置上次调用抛出的异常
在 EasyMock 中还可以设置调用所执行的次数,具体细节请参见对应的 javaDoc 。
4. 使用举例:
MockControl control= MockControl.createControl( HttpServletRequest.class);
HttpServletRequest mock= (HttpServletRequest)control.getMock();
mock.getParameter( "test");
// 设置第一次调用 request.getParameter 的返回值
control.setReturnValue( null, 1);
// 设置第二次调用 request.getParameter 的返回值
control.setReturnValue("this is a test", 1);
control.replay();
assertEquals( RequestUtil.getString( mock, "test", "haha"), "haha");
assertEquals( RequestUtil.getString( mock, "test"), "this is a test");
control.verify();
5. 在 Mock 对象使用结束后,务必调用控制器的 verify 函数,以确认 Mock 对象的方法得到了调用。
6. 调用方法的次序,使用 Strict 。有时,测试代码依赖于被依赖组件的方法的次序。如在测试与数据库相关代码时,测试代码很有可能是这样的次序:先打开数据库链接,执行操作,关闭链接。为了更好的测试这样的代码,可以使用 MockControl.createStrictControl() 来创建一个严格的 Mock 对象控制器,在其中,他会规定 Mock 出来的对象的调用次序。
以上是 EasyMock 的主要使用,至于其他的用法,请参见具体的文档。
检查表
在此列出使用 Mock 对象来进行 unit test 需要注意的问题:
- 当自己动手实现 Mock 对象时,不要在 Mock 对象中实现业务逻辑。
分享到:
相关推荐
EasyMock是Java编程中的一款强大的模拟框架,它允许开发者在单元测试中创建和控制...通过阅读《EasyMock使用简明手册》和解压后的easymock2.4.zip文件,开发者可以深入理解并掌握如何有效地使用EasyMock进行单元测试。
EasyMock单元测试的扩展; EasyMock简介(抽象类接口做测试); EasyMock来进行测试; EasyMock如何打桩; EasyMock实践指南;...EasyMock使用简明手册; EasyMock使用说明; EasyMock使用手记; 用Mock object进行隔离测试;
EasyMock单元测试的扩展; EasyMock简介(抽象类接口做测试); EasyMock来进行测试; EasyMock如何打桩; EasyMock实践指南;...EasyMock使用简明手册; EasyMock使用说明; EasyMock使用手记; 用Mock object进行隔离测试;
在这个"EasyMock 使用案例(含lib)"中,我们将会深入探讨如何利用EasyMock进行Java单元测试,并通过具体的例子——EasyMockDemo来讲解其用法。 首先,EasyMock的基本理念是让你能够定义模拟对象的行为,比如它应该...
【EasyMock使用方法】 1. **创建模拟对象**:首先,需要通过`EasyMock.createMock()`方法创建模拟对象,指定需要模拟的接口。 2. **预设行为**:使用`expect()`方法设定模拟对象的方法调用应如何响应,例如返回...
在实际使用EasyMock时,我们通常会遵循以下步骤: 1. **创建模拟对象**:首先,你需要通过`EasyMock.createMock()`方法创建一个模拟对象。例如,如果你有一个名为`MyInterface`的接口,你可以这样创建它的模拟对象...
本文将对 EasyMock 的功能和原理进行介绍,并通过示例来说明如何使用 EasyMock 进行单元测试。 Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与...
本文将深入探讨EasyMock的使用方法及其工作原理,帮助开发者更好地理解和运用这一工具。 ### EasyMock的基本概念 - **模拟对象(Mock Object)**:在测试中,模拟对象是替代真实对象的类,它会根据预定义的行为来...
- **创建模拟对象**:你可以使用`EasyMock.createMock()`方法创建一个模拟对象,然后通过`EasyMock.replay()`进入“播放”模式,让模拟对象按照预期执行。 - **设置预期**:使用`expect()`方法设置对模拟对象的期望...
EasyMock和Mockito是两个广泛使用的Java模拟框架,它们可以帮助开发者在隔离环境中测试代码,避免了依赖其他组件或服务的复杂性。本文将详细介绍这两个工具的使用方法、原理和差异。 **EasyMock** EasyMock是一个...
例如,使用`@Before`注解设置测试前的准备工作,使用`@Test`注解定义测试方法,并在其中使用EasyMock的API进行模拟和验证。 总之,EasyMock 3.2 提供了一个强大而灵活的模拟工具,帮助开发者编写高质量的单元测试,...
2. **创建模拟对象**:使用Easymock的`createMock`或`createNiceMock`方法创建模拟对象。 3. **设置预期**:通过`expect`方法设定模拟对象的方法调用预期。 4. **启动测试**:调用`replay`方法开始执行模拟。 5. ...
还在为EasyMock使用时出异常而烦恼? 本压缩包包含除了Junit4之外easyMock3.1所用到的所有相关jar包,junit4可自己导入eclipse自带的即可 本压缩包包括: asm.jar cglib.jar objenesis.jar等 其中asm与cglib已兼容,放心...
EasyMock使用教程,快来看看你还有什么秘密没有发现吧!
5. **验证行为**:测试完成后,使用`EasyMock.verify()`方法检查模拟对象是否按照预期被调用了。这有助于确保你的代码正确地使用了模拟对象。 ```java EasyMock.verify(myServiceMock); ``` 6. **清理资源**:...