2011-09-12 38 views
2

我想要一個幫助器類來獲取當前日期。由於未來的測試問題(可能需要返回與系統時間不同的時間),因此我想避免在代碼中使用new Date(),並且我無法使用JodaTime來防止測試出現問題。java.util.Date的Mockable幫助器類

我想這樣的幫手:

public interface DateHelper { 

    /** 
    * Returns the current date. 
    */ 
    Date now(); 

} 

但我怎麼能提供這種接口的嘲笑給客戶呢? 我能想到的唯一的解決辦法是這樣的:

public ClientOfDateHelper { 

    private DateHelper dateHelper; 

    // no-arg constructor that instantiates a standard implementation of DateHelper 
    public ClientOfDateHelper() { 
     this.dateHelper = new DefaultDateHelper(); 
    } 

    // constructor that can be used to pass mock to the client 
    public ClientOfDateHelper(DateHelper suppliedDateHelper) { 
     this.dateHelper = suppliedDateHelper; 
    } 

    public void foo() { 
     Date today = dateHelper.now(); 
     // do some work that requires today's date 
    } 

} 

是否有需要使用DateHelper更少的代碼更優雅的解決方案,但它允許使用嘲笑?

+1

依賴注入或依賴查詢(即客戶端從某個中央服務/類請求日期助手)如何? – Thomas

回答

0

易於測試是依賴注入的好處之一。使用像Spring這樣的框架可以讓您在外部配置您的依賴關係。所以你的實現將使用你的spring配置運行,並且你的單元測試將通過你通過構造函數或屬性設置器提供的模擬來運行。這消除了上述兩個構造器的需要,您只需使用一個接受DateHelper的構造器即可。