实验报告3
实验报告 实验名 称: : ********************** 专 业:
*************** 班 级:
***** 姓 名:
****** 学 号:
*********** 指导老师:
****** 2014年*月*日 1
一、实验目的 1)理解单元测试阶段Mock Object的用法; 2)掌握使用 Eclipse+JUnit+EclEmma+EasyMock 进行基本路径覆盖测试的方法。
二、实验工具 Eclipse、JUnit、eclemma 和EasyMock 三、实验内容 四、实验代码(1)AccountInfo package atm;2
public class AccountInfo { private String cardNo;private String password;private int balance;public AccountInfo(String c, String p, int b){ cardNo=c;password=p;balance=b;} public String getCardNo(){ return cardNo;} public void setCardNo(String cardNo){ this.cardNo = cardNo;} public String getPassword(){ return password;} public void setPassword(String password){ this.password = password;} public int getBalance(){ return balance;} public void setBalance(int balance){ this.balance = balance;} }(2))类 ATMService package atm;public class ATMService { private IDataConnection dconn;public ATMService(IDataConnection dc){ dconn=dc;} //取款操作 public void withdraw(String cardNo,int amount){ AccountInfo a=dconn.getAccount(cardNo);int balance=a.getBalance()-amount;a.setBalance(balance);dconn.updateAccount(a);} //存款操作 3
public void deposit(String cardNo,int amount){ AccountInfo a=dconn.getAccount(cardNo);int balance=a.getBalance()+amount;a.setBalance(balance);dconn.updateAccount(a);} //转账操作 public void transfer(String fromCardNo,String toCardNo,int amount){ AccountInfo a=dconn.getAccount(fromCardNo);AccountInfo b=dconn.getAccount(toCardNo);int aBalance=a.getBalance()-amount;int bBalance=b.getBalance()+amount;a.setBalance(aBalance);b.setBalance(bBalance);dconn.updateAccount(a);dconn.updateAccount(b);} //查询操作 public int inquiry(String cardNo){ AccountInfo a=dconn.getAccount(cardNo);return a.getBalance();} }(3 3)接口 IdataC onnecrion package atm;public interface IDataConnection { public AccountInfo getAccount(String id);public void updateAccount(AccountInfo account);public void addAccount(AccountInfo account);}(4)MockDataConnection package atm;import java.util.HashMap;public class MockDataConnection implements IDataConnection { private HashMap
mdb.put(b.getCardNo(), b);} @Override public AccountInfo getAccount(String id){ // TODO Auto-generated method stub return mdb.get(id);} @Override public void updateAccount(AccountInfo account){ // TODO Auto-generated method stub addAccount(account);} @Override public void addAccount(AccountInfo account){ // TODO Auto-generated method stub mdb.put(account.getCardNo(), account);} }(5)TestATMService单 单 元测试用例 package atm;import static org.junit.Assert.*;import org.junit.Test;public class TestATMService { private IDataConnection mdc = new MockDataConnection();private ATMService atm = new ATMService(mdc);@Test public void testWithdraw(){ atm.withdraw("1", 20);AccountInfo a = mdc.getAccount("1");assertEquals(280,a.getBalance());} @Test public void testDeposit(){ atm.deposit("1",20);AccountInfo a = mdc.getAccount("1");assertEquals(320,a.getBalance());} @Test public void testTransfer(){ atm.transfer("2", "1", 200);AccountInfo a = mdc.getAccount("1");AccountInfo b = mdc.getAccount("2");assertEquals(500,a.getBalance());5
assertEquals(800,b.getBalance());} @Test public void testInquiry(){ assertEquals(1000,atm.inquiry("2"));} } 五、实验结果 分析:红色代表未执行、黄色代表条件没有全部执行、绿色代表执行过了:
测试用例执行情况:
测试用例的覆盖情况:
(6)TestATMServiceWithEMock 单元测试用例 package atm;import static org.easymock.EasyMock.*;import static org.junit.Assert.*;import org.junit.Before;import org.junit.Test;public class TestATMServiceWithEMock { private ATMService atm;private IDataConnection mock;@Before public void setUp(){ mock = createMock(IDataConnection.class);atm = new ATMService(mock);} @Test public void testTransfer(){ AccountInfo a = new AccountInfo("1","111111",500);AccountInfo b = new AccountInfo("2","222222",1000);7
//设置期望值expect(mock.getAccount("1")).andReturn(a);expect(mock.getAccount("2")).andReturn(b);mock.updateAccount(a);mock.updateAccount(b);replay(mock);//回放 //执行被测方法atm.transfer("2", "1", 150);//验证执行被测方法后的状态assertEquals(650,a.getBalance());assertEquals(850,b.getBalance());verify(mock);} } 测试用例执行情况:
