`

Junit学习笔记三——easyMock

 
阅读更多

单元测试中,使用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/

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics