用EasyMock进行单元测试:什么是EasyMoc
作者:网络转载 发布时间:[ 2013/7/11 14:13:17 ] 推荐标签:
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实在是很必要的。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11