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实在是很必要的。