之前我們看到了Test接口里面的run方法有個TestResult的參數,不錯,這個類就是用來收集測試結果的,是收集TestSuite的運行結果,所以一般情況下,一個TestSuite對應一個TestResult. TestResult存儲了所有測試的詳細情況,是通過還是失敗。
如果是失?。?STRONG>Junit會創建一個TestFailure對象,并保存在TestResult中。
這里知道了TestResult的作用,這種做法也會引入另外一個設計模式。
Java設計模式:Collecting Parameter模式
定義:當你需要從幾個方法中收集結果時,你應當給方法增加一個參數,并傳遞一個會替你收集參數的對象。
這里TestResult類就是起到了這個作用。但是我們知道TestResult是收集很多運行的Test的運行結果,這里就需要對于這些運行結果進行管理,則TestResult類定義了如下相關的方法:
public synchronized void addError(Test test, Throwable t) 新增一個錯誤到ArrayList
public synchronized void addFailure(Test test, AssertionFailedError t) 新增一個失敗到ArrayList
public synchronized void addListener(TestListener listener) 在一個test中注冊一個監聽器到ArrayList
public synchronized void removeListener(TestListener listener) 從一個test中取消這個監聽器。
private synchronized List
我們已經知道了TestResult的作用,那么TestListener的作用又是什么呢?在Run一個測試用例的時候有很多的結果,這時就由TestListener去觀察這個運行的結果,并且負責報告這些運行信息。
TestListener是個接口,一般由Test Runner,很多特定的Junit擴展也實現了這個接口,我們來看下這個接口里面定義了哪些方法:
public void addError(Test test, Throwable t); 發送錯誤的時候才被調用。
public void addFailure(Test test, AssertionFailedError t); 失敗的時候才被調用。
public void endTest(Test test); 測試結束時被調用。
public void startTest(Test test); 測試開始時被調用。
由于定義了這個TestListener接口和實現類TestRunner的作用都看到了,特別是給擴展Junit提供了新的實現類的方式,這樣的做法就引出了一個設計模式。
Java設計模式:Observer模式
定義:在對象之間定義了一個一對多的依賴關系,這樣當一個對象改變了狀態,那么所有依賴于它的對象都會自動收到通知且更新。目前Junit框架的TestRunner就以TestListener的身份注冊到TestResult。
我們在寫testcase的時候,都會用到Assert方法去check運行結果,這時候的Assert方法是繼承了Junit的TestCase類,但是你如果還記得TestCase類的聲明的話,那就是TestCase不僅僅實現了Test接口,而且也繼承了Assert類,其實這些Assert方法就是Assert類中實現的。
Junit的Assert類中總共有38個Assert方法,但很多都是不停的重載,其實就只有8個核心方法:
assertTure; assertFalse; assertEquals; assertNotEquals; assertNull; assertSame; assertNotSame; fail(讓測試失敗,并給出指定的信息)
一般要用到拋出message的都會用到fail方法。
原文轉自:http://www.anti-gravitydesign.com