2011-04-30 42 views
0

我正在閱讀http://xunitpatterns.com/Test%20Stub.html並且對使用存根有一些疑問,例如,在頁面上顯示的代碼中,作者創建了一個名爲TimeProviderTestStub.java的類用於測試代碼。我對此行的測試代碼有些疑惑:關於使用存根 - Java

TimeDisplay sut = new TimeDisplay(); 
    //  Test Double installation 
    sut.setTimeProvider(tpStub); 

我需要修改我的課(SUT)以收到一個對象TimeProviderTestSub?

回答

6

存根和實際類都應該實現某個接口,即ITimeProvidersetTimeProvider()應該將此接口作爲其參數。界面必須公開SUT需要與對象交互的所有方法,因爲TimeDisplay現在只能通過ITimeProvider界面使用對象(這允許我們在測試中使用存根而不是實際對象)。

在該示例中,SUT(TimeDisplay)似乎只需要getTime()方法,所以界面應該只包含方法:

public interface ITimeProvider { 
    Calendar getTime(); 
} 

短截線的聲明應該是

public class TimeProviderTestStub implements ITimeProvider { ... } 

和真實類的聲明應該是

public class TimeProvider implements ITimeProvider { ... } 

最後,SUT必須改變它的設置器方法接受接口:

public void setTimeProvider(ITimeProvider timeProvider) { ... } 

,改變其內部timeProvider字段是類型ITimeProvider的。

如果您不控制真實類的代碼(以至於無法使其實現接口),則可以創建一個適配器類,它包裝真實類並實現接口。

+0

不錯,謝謝,所以: 這個接口有兩種方法嗎? setTimeProvider一個用於存根,一個用於真正的obj? – elf 2011-04-30 15:43:06

+0

@ user428691:文章應該提供了類聲明;這會讓所有事情變得更清晰。看我最後的編輯。 – 2011-04-30 15:54:11

+0

Eldhuset非常好,很好,謝謝。 – elf 2011-04-30 16:05:13