关闭

用EasyMock进行单元测试:什么是EasyMoc

发表于:2013-7-11 11:02

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:周亮    来源:51Testing软件测试网采编

  UserDao.validate(String)方法对用户组进行了判断,如果用户是“admin”,则返回true,否则返回false,那么测试代码可以是这样:

import static org.easymock.EasyMock.*;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
public class UserDaoTest {
private static final String USERNAME = "liang";
private UserDao userDao = new UserDao();
private ServiceClient client;
private List<String> groupContainsAdmin;
private List<String> groupNotContainAdmin;
@Before
public void before() {
client = createMock(ServiceClient.class);
groupContainsAdmin = new ArrayList<String>() {
{
add("admin");
add("user");
}
};
groupNotContainAdmin = new ArrayList<String>() {
{
add("user");
}
};
}
@Test
public void testValidateIsAdmin() {
expect(client.getGroupsByUser(eq(USERNAME))).andReturn(
groupContainsAdmin);
userDao.setClient(client);
replay(client);
boolean isAdmin = userDao.validate(USERNAME);
assertTrue(isAdmin);
verify(client);
}
@Test
public void testValidateIsNotAdmin() {
expect(client.getGroupsByUser(eq(USERNAME))).andReturn(
groupNotContainAdmin);
userDao.setClient(client);
replay(client);
boolean isAdmin = userDao.validate(USERNAME);
assertFalse(isAdmin);
verify(client);
}
}

  整个代码的执行流程如下:

  1.每个测试运行之前,先调用EasyMock.createMock(Class)方法创建了ServiceClient的Mock对象;

  2.在每个测试中,使用EasyMock.expect()方法录制Mock对象的行为,如testValidateIsAdmin()中设置getGroupsByUser()方法的参数必须是USERNAME,并且返回值是groupContainsAdmin,而testValidateIsNotAdmin()中getGroupsByUser()则返回groupNotContainAdmin。这里值得注意的是EasyMock.eq()方法和andReturn()方法;

  3.Mock对象行为录制完成后,调用EasyMock.replay()返回标记Mock对象为回放状态;

  4.调用业务方法,并且验证业务代码的逻辑的正确性;

  5.最后调用EasyMock.verify()验证业务代码的执行逻辑和我们录制的一样,确保业务逻辑的调用远程服务执行的正确性。

  EasyMock除了上面的方法外,还提供了EasyMock.isA(Class),EasyMock.andStubReturn()等方法以便于更好的完成测试。详细参考http://easymock.org/EasyMock3_1_Documentation.html,我之后的文章也会进行总结。

  不过EasyMock也有不如人意的地方,因为EasyMock本身用Java的动态代理方式实现,因此无法实现对静态方法的Mock,不过还有更为强大的PowerMock通过cglib这样的字节码操作库实现了对静态方法的Mock,不过即使再强大的PowerMock也是基于EasyMock实现的,因此了解EasyMock实在是很必要的。

22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号