2010-10-21 21 views
2

Gojko Adzic今天在他的博客上發佈了關於史蒂夫弗里曼的單元測試技巧,這有助於明確爲什麼單元測試中的日期比較失敗。 Here is the blog post describing the trick - it is not long邪惡的JUnit日期技巧 - 你將如何在C#中做到這一點?

特技的關鍵部分是該方法(在Java中),它覆蓋在日期類的特定實例的ToString()

private Date namedDate(final String name, final Date date) { 
    return new Date(date.getTime()){ 
     @Override 
     public String toString() { 
      return name; 
     } 
    }; 
} 

看來,這種方法使用的Java語言中的設施,沒有在C#(或至少一個,我所知道的)比賽。如果您可以告訴我如何在C#中執行相同的技巧,那將非常棒。

+0

這不是反射,只是一個匿名內部類。我想你可以在C#中做同樣的事情,或者只是創建一個C#的等價日期類的命名子類。 – 2010-10-21 18:29:37

+0

@Mark:反射只是一個猜測 - 刪除標籤。 – azheglov 2010-10-21 18:37:11

+0

我想不出一種方法來複制它。如果DateTime不是結構體,我們可以繼承它並覆蓋,但事實並非如此。並且擴展方法不會覆蓋實例方法。考慮隱式類型轉換,但是它們必須在字符串或DateTime上定義。認爲你可能在這裏失敗了,只是改變了測試代碼。 – 2010-10-21 18:37:35

回答

4

這被稱爲Java中的匿名類。它實際上只是一個類實現一個沒有名字,它覆蓋的ToString()

能夠在C#與一個正常的,已命名的類相同的 - 唯一的問題是,該日期時間是在C#中的結構,所以你不能從它繼承。

C#具有匿名類型,但與Java沒有相同的方式。在C#中,您可以使用匿名類型並指定它的屬性,但不能指定任何方法實現。因此,C#和Java中的匿名類型往往被用於不同的事情。

編輯

這裏是你會怎麼做它在C#中的例子,但如上所述,你不能在C#中做它的日期時間(或其他struct S,或密封類)。爲了這個例子,我使用一個名爲Token的假想類,它具有單個字符串屬性「Value」:

private Token GetNamedToken(Token t, string name) 
{ 
    return new NamedToken {Value = t.Value, Name = name}; 
} 

private class NamedToken : Token 
{ 
    public string Name { get; set; } 
    public override string ToString() 
    { 
     return Name; 
    } 
} 
+1

同樣,這個技巧對Java中的任何基本包裝(Integer,Double等)都不起作用,因爲它們被標記爲final 。 – 2010-10-21 18:34:53

+2

DateTime不是一個類,它是一個結構體(值類型)。 – 2010-10-21 18:56:17