第四個類是測試類:ServiceClassTest(實現的性質已經被盡可能地簡化)。清單 1 將顯示第四個類的代碼。
清單 1. 服務類的樣例代碼
public class ServiceClass {
public ServiceClass(){
//no-args constructor
}
public boolean runService(ICollaborator collaborator){
if("success".equals(collaborator.executeJob())){
return true;
}
else
{
return false;
}
}
}
在 ServiceClass 類中,if...else 代碼塊是一個簡單的邏輯分支,根據測試期望說明選取一條路經 —— 而不是另一條路經 —— 之后測試將失敗(或通過)的原因。下面顯示了 Collaborator 類的源代碼。
清單 2. Collaborator 類的樣例代碼
public class Collaborator implements ICollaborator{
public Collaborator(){
//no-args constructor
}
public String executeJob(){
return "success";
}
}
Collaborator 類也十分簡單,它配有無參數的構造函數以及從 executeJob() 方法返回的簡單 String。下面的代碼顯示了 ICollaborator 類的代碼。
public interface ICollaborator {
public abstract String executeJob();
}
接口 ICollaborator 有一個必須在 Collaborator 類中實現的方法。
以上代碼緒后,讓我們繼續檢驗怎樣在各種場景中成功地運行 ServiceClass 類的測試。
回頁首
場景 1:使用 jMock 模擬接口
測試 ServiceClass 類中的服務方法十分簡單。假定測試要求為證明 runService() 方法并未運行 —— 換言之,返回的布爾結果是 false。在這種情況下,傳遞給 runService() 方法的 ICollaborator 對象被模擬 為期望調用 executeJob() 方法,并返回除了 “success” 以外的字符串。通過這種方法,確保把布爾字符串 false 返回給測試。
下面所示的是包含測試邏輯的 ServiceClassTest 類代碼。
清單 3. 場景 1 的 ServiceClassTest 類樣例代碼
import org.jmock.Mock;
import org.jmock.cglib.MockObjectTestCase;
public class ServiceClassTest extends MockObjectTestCase {
private ServiceClass serviceClass;
private Mock mockCollaborator;
private ICollaborator collaborator;
public void setUp(){
serviceClass = new ServiceClass();
mockCollaborator = new Mock(ICollaborator.class);
}
public void testRunServiceAndReturnFalse(){
mockCollaborator.expects(once()).method
("executeJob").will(returnValue("failure"));
collaborator = (ICollaborator)mockCollaborator.proxy();
boolean result = serviceClass.runService(collaborator);
assertFalse(result);
}
}
編寫測試的時機
用測試模擬框架運行您自己的測試的佳方法是利用 test-first 靈活方法。首先創建測試并設定期望。僅在測試失敗后才編寫實現以修正測試。當測試運行正常時,您將編寫另一個測試以檢查稍后添加到待測試的類中的功能。