日期:2014-05-20  浏览次数:20783 次

关于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) //验证两次的行为是否一致