关闭

有效使用Mock编写java单元测试

发表于:2013-11-15 11:28

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

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

  Java单元测试对于开发人员质量保证至关重要,尤其当面对一团乱码的遗留代码时,没有高覆盖率的单元测试做保障,没人敢轻易对代码进行重构。然而单元测试的编写也不是一件容易的事情,除非使用TDD方式,否则编写出容易测试的代码不但对开发人员的设计编码要求很高,而且代码中的各种依赖也常常为单元测试带来无穷无尽的障碍。
  令人欣慰的是开源社区各种优秀的Mock框架让单元测试不再复杂,本文简单介绍EasyMock,PowerMock等的基本常用用法。
  Mock说白了就是打桩(Stub)或则模拟,当你调用一个不好在测试中创建的对象时,Mock框架为你模拟一个和真实对象类似的替身来完成相应的行为。
  EasyMock:
  EasyMock使用动态代理实现模拟对象创建,其基本步骤为以下四步:
  以数据库应用为例的被测试代码如下:
public class UserServiceImpl{
private UserDao dao;
public User query(String id) throws Exception{
try{
return dao.getById(id);
}catch(Exception e){
throw e;
}
return null;
}
}
public class UserDao{
public User getById(String id) throws Exception{
try{
return ……;
}catch(Exception e){
throw e;
}
return null;
}
}
  现在希望对UserServiceImpl进行测试,而UserDao开发组只给出接口,尚未完成功能实现。
  使用Mock对UserDao进行模拟来测试UserServiceImpl。
  (1).基本的测试代码如下:
public class UserServiceImplTest {
@Test
public void testQuery() {
User expectedUser = new User();
user.setId(“1001”);
UserDao mock  = EasyMock.createMock(UserDao.class);//创建Mock对象
Easymock.expect(mock.getById("1001")).andReturn(expectedUser);//录制Mock对象预期行为
Easymock.replay(mock);//重放Mock对象,测试时以录制的对象预期行为代替真实对象的行为
UserServiceImpl  service = new UserServiceImpl();
service.setUserDao(mock);
user user = service.query("1001");//调用测试方法
assertEquals(expectedUser, user); //断言测试结果
Easymock.verify(mock);//验证Mock对象被调用
}
}
  注意:
  在EasyMock3.0之前,org.easymock.EasyMock使用JDK的动态代理实现Mock对象创建,因此只能针对接口进行Mock,org.easymock.classextension.EasyMock使用CGLIB动态代理创建Mock对象,可以针对普通类进行Mock。
51/512345>
《2023软件测试行业现状调查报告》独家发布~

精彩评论

  • 13428159630
    2013-11-17 20:50:13

    你好,我是一名在校的学生,学的是软件测试,有很多问题想问你们这些有有工作的江湖人士。你们有空的吗?如果方便就留Q给我吧

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号