单元测试中,使用Junit与easyMock结合的方式,可以方便构造一些复杂的对象。
使用之前,工程在引入junit jar包的基础上,要引入eassymock 的jar包。
先给出一个简单的例子:
package com.lb.myownclass; /** * user * @author L.B. * */ public class User { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
package com.lb.myownclass; public interface UserDao { public void add(User user) ; public User find(String name); }
package com.lb.myownclass; public class UserService { private UserDao userDao; public void add(User user){ userDao.add(user); } public User find(String name){ return userDao.find(name); } public void setUserDao(UserDao userDao){ this.userDao = userDao; } }现在要对UserService进行测试
package com.lb.myowntest; import static org.junit.Assert.*; import org.junit.Test; import static org.easymock.EasyMock.*; import com.lb.myownclass.User; import com.lb.myownclass.UserDao; import com.lb.myownclass.UserService; public class UserServiceTest { private static UserService userService = new UserService(); @Test public void testAdd() { User user = new User(); user.setName("xx"); user.setAge(20); //mock UserDao userDao = createMock(UserDao.class); userDao.add(isA(User.class)); expectLastCall().once(); replay(userDao); userService.setUserDao(userDao); userService.add(user); verify(userDao); } @Test public void testFind() { //mock UserDao userDao = createMock(UserDao.class); User user = new User(); user.setName("xx"); user.setAge(20); expect(userDao.find(isA(String.class))).andReturn(user).once(); replay(userDao); userService.setUserDao(userDao); userService.find("xx"); verify(userDao); } }从例子中可以看出,使用easymock的步骤为:
- 使用 EasyMock 生成 Mock 对象;(createMock)
- 设定 Mock 对象的预期行为和输出;(expect)
- 将 Mock 对象切换到 Replay 状态;(replay)
- 调用 Mock 对象方法进行单元测试;(调用测试方法)
- 对 Mock 对象的行为进行验证。(veryfiy)
Mock 对象的行为可以简单的理解为 Mock 对象方法的调用和方法调用所产生的输出。是一个虚拟的对象,目的在于形成一个比较独立的测试环境。
在testAdd()中模拟了无返回值的mock对象使用方法,
UserDao userDao = createMock(UserDao.class); 生成了一个UserDao的mock对象。
userDao.add(isA(User.class)); 该句表示要模拟的方法是userDao的add方法。
expectLastCall().once();表示在测试中,方法被调用了一次。
replay(userDao);表示将mock对象置为replay状态。
在testFind()中模拟的是有返回值的mock对象使用方法,
不同点在于expect(userDao.find(isA(String.class))).andReturn(user).once();该句表示期望userDao.find(String string)方法返回的值是user,当然,user需要事先设置好。
EasyMock参数匹配器
在模拟方法时,比如userDao.find(String name),可以直接采用expect(userDao.find("xx")).andReturn(user).once()的方式,但是这种方式有一个弊端,就是模拟方法的传入值,与userService.find(String name)运行时的传入值必须保持一致,如果测试用例中我们测试userService.find("ff"),就不能正确匹配expect(userDao.find("xx")).andReturn(user).once()中的方法。
isA(Class<T> clazz) 表示传入参数类型匹配就可以。
其他参数匹配器:
aryEq(X value)
:通过Arrays.equals()
进行匹配,适用于数组对象;isNull()
:当输入值为Null时匹配;notNull()
:当输入值不为Null时匹配;same(X value)
:当输入值和预期值是同一个对象时匹配;lt(X value), leq(X value), geq(X value), gt(X value)
:当输入值小于、小等于、大等于、大于预期值时匹配,适用于数值类型;startsWith(String prefix), contains(String substring), endsWith(String suffix)
:当输入值以预期值开头、包含预期值、以预期值结尾时匹配,适用于String类型;matches(String regex)
:当输入值与正则表达式匹配时匹配,适用于String类型。- anyObject():任意输入值都与期望值匹配
更多介绍参考http://www.ibm.com/developerworks/cn/opensource/os-cn-easymock/
相关推荐
Junit学习笔记,希望有用~~~~~~~~~~~~~~~~~~~~~~
junit4.4.jar +easymock3.0.jar
JUnit是一款由Erich Gamma(《设计模式》的作者)和Kent Beck(极限编程的提出者)编写的开源的回归测试框架,供Java编码人员做单元测试之用。当前版本4.1,可以从www.junit.org网站上获得。与早期的JUnit 3相比,...
junit单元测试——浅浅笔记
Junit框架是设计模式应用的经典案例,从中你可以更好的学习和掌握设计模式的使用!
Junit学习笔记和课件,欢迎学习爱好者下载资源,共同学习。。
NULL 博文链接:https://greatjone.iteye.com/blog/1161009
JUnit学习笔记之NetBeans入门篇,一句话好东西
Junit+EasyMock单元测试使用资料以及案例分析,供学习单元测试的朋友学习使用!
通过单元测试工具(Junit)支持,使学生对单元测试中测试用例的设计原则,设计方法进行了解和掌握。
JUnit学习资料
NULL 博文链接:https://1017401036.iteye.com/blog/2407857
现在的版本都4.3.1,3.8.1的感觉好象不好找,虽然www.junit.org能够找到,但对我们这种英语不好的来说,还是不好找,再说了,现在好多的教程都是以3.8.1来写的,所以在这里把我找到的3.8.1传上来供大家以后下载 博文链接:...
Junit良葛格学习笔记,喜欢的下啊!!!
JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编写。 先简单解释一下什么是Annotation,这个单词一般是翻译成元数据。元数据是什么?元数据就是描述数据的数据。也...
中间有各种Junit文档,Junit各种操作手册!3.8--4.9。还有本人学习的笔记。绝对值得下载。
powermock-easymock-junit-1.5.4.zip
JUnit学习笔记及练习用例,主要分为JUnit3.8.2和JUnit4.8.1两个版本。