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

Java单元测试对于开发人员质量保证至关重要,尤其当面对一团乱码的遗留代码时,没有高覆盖率的单元测试做保障,没人敢轻易对代码进行重构。然而单元测试的编写也不是一件容易的事情,除非使用TDD方式,否则编写出容易测试的代码不但对开发人员的设计编码要求很高,而且代码中的各种依赖也常常为单元测试带来无穷无尽的障碍。

令人欣慰的是开源社区各种优秀的Mock框架让单元测试不再复杂,本文简单介绍EasyMock,PowerMock等的基本常用用法。

Mock说白了就是打桩(Stub)或则模拟,当你调用一个不好在测试中创建的对象时,Mock框架为你模拟一个和真实对象类似的替身来完成相应的行为。

EasyMock:

使用如下方式在Maven中添加EasyMock的依赖:

<dependency>
      <groupId>org.easymock</groupId>
      <artifactId>easymock</artifactId>
      <version>3.2</version>
      <scope>test</scope>
    </dependency>

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。

在EasyMock3.0之后,org.easymock.classextension.EasyMock被废弃,使用org.easymock.EasyMock可以针对接口和普通类进行Mock对象创建。

(2).调用测试设定:

如果想测试UserServiceImpl调用了UserDao的getById方法3次,则使用如下代码即可:

Easymock.expect(mock.getById("1001")).andReturn(exceptUser).times(3);

(3).方法异常:

如果想测试UserServiceImpl在调用UserDao的getById方法时发生异常,可以使用如下代码:

Easymock.expect(mock.getById("1001")).andThrow(new RuntimeException());
在测试UserServiceImpl时就可以使用try-catch捕获Mock的异常。

(4).基本参数匹配

  • 15
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Mock是一种测试技术,可以模拟对象的行为,使得测试可以进行得更快、更简单、更可靠。在Java单元测试中,Mock通常用于模拟依赖项的行为,以便我们可以专注于测试我们自己的代码逻辑。以下是使用Mockito框架进行Java单元测试Mock的步骤: 1. 导入Mockito依赖项 ``` <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>2.23.4</version> </dependency> ``` 2. 创建需要测试的及其依赖项 ``` public class UserService { private UserDao userDao; public UserService(UserDao userDao) { this.userDao = userDao; } public User getUserById(int id) { return userDao.getUserById(id); } } public class UserDao { public User getUserById(int id) { // 从数据库中获取用户信息 } } ``` 3. 编写单元测试 ``` @RunWith(MockitoJUnitRunner.class) public class UserServiceTest { @Mock private UserDao userDao; @InjectMocks private UserService userService; @Test public void testGetUserById() { User user = new User(); user.setId(1); user.setName("Tom"); when(userDao.getUserById(1)).thenReturn(user); User result = userService.getUserById(1); assertEquals("Tom", result.getName()); } } ``` 在这个示例中,我们使用Mockito框架来模拟UserDao的行为,并将其注入到UserService中。然后,我们使用when/thenReturn方法来设置getUserById方法的行为。最后,我们测试getUserById方法是否返回正确的用户信息。 这就是使用Mockito框架进行Java单元测试Mock的基本步骤。Mockito框架提供了很多其他的方法和功能,可以帮助我们更轻松地编写单元测试

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值