关于easyMock程序的一段节选 希望有人能解释一下
public class AccountServiceTest extends TestCase{
private AccountDAO accountDAOMock;
private AccountServiceImpl accountService;
@Override
protected void setUp() throws Exception {
accountDAOMock = createMock(AccountDAO.class);
accountService = new AccountServiceImpl();
accountService.setAccountDAO(accountDAOMock);
}
public void testGetAccount() {
String name = " kafka ";
String pwd = " 0102 ";
Account a = new Account();
a.setName(name);
a.setPwd(pwd);
a.setId(new Long(10));
reset(accountDAOMock); // (a)
expect(accountDAOMock.getByNameAndPwd(name, pwd)).andReturn(a); // (b)
replay(accountDAOMock); // (c)
Account b = accountService.getAccount(name, pwd);
System.out.println(b.getName()+ b.getPwd());
assertEquals(a, b);
verify(accountDAOMock); // (d)
}
------解决方案--------------------
简要的说明了一下 Mock 对象的工作过程:
1 )在 setUp() 中,通过 “accountDAOMock = createMock(AccountDAO.class);” (这里使用了 java5 中的静态导入),创建 AccountDAO 的 Mock 对象,由于 EasyMock 采用了范型技术,故创建的 Mock 对象不需要强制类型转换。然后通过 “accountService.setAccountDAO(accountDAOMock);” 设置目标对象的合作者对象。
2 )对于测试方法 “testGetAccount()” , (a) 处的 reset() 方法是将 Mock 对象复位,也就是重新设置 Mock 对象的状态和行为。由于此处是第一次调用 Mock 对象,可以不必使用 reset() 方法。
3 ) (b) 处 expect() 是录制 Mock 对象方法的调用,其参数就是 Mock 对象的方法,其中如果调用的方法有返回值,要通过 andReturn() 方法设置预期的返回值。
4 ) (c) 处的 replay() 是结束录制过程。 在调用 replay() 方法之前的状态, EashMock 称之为 “record 状态 ” 。该状态下, Mock 对象不具备行为(即模拟接口的实现),它仅仅记录方法的调用。在调用 replay() 后,它才以 Mock 对象预期的行为进行工作,检查预期的方法调用是否真的完成。
5 ) (d) 处的 verify() 是用于在录制和回放两个步骤完成之后进行预期和实际结果的检查。这里就是检查 accountDAOMock 是否如预期一样调用了 getByNameAndPwd 方法。
------解决方案--------------------
reset(accountDAOMock); // (a) 重置
expect(accountDAOMock.getByNameAndPwd(name, pwd)).andReturn(a); // (b)
//设定要调用Mock的getByNameAndPwd且参数是name, pwd, 返回a
replay(accountDAOMock); // (c)
//因为要验证Mock的行为,前面的expect相当于录制,replay相当于倒带
Account b = accountService.getAccount(name, pwd);
//调用accountService.getAccount相当于又录了一次
System.out.println(b.getName()+ b.getPwd());
assertEquals(a, b);
verify(accountDAOMock); // (d) //验证两次的行为是否一致