邪恶的JUnit日期技巧 - 你会如何在C#中做到这一点?

时间:2010-10-21 18:27:40

标签: c# .net unit-testing

Gojko Adzic今天在他的博客上发布了关于Steve Freeman的单元测试技巧,这有助于明确为什么单元测试中的日期比较失败。 Here is the blog post describing the trick - it is not long

这个技巧的关键部分是这个方法(在Java中),它覆盖了 Date 类的特定实例上的 ToString()

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

看来这种方法使用的是Java语言的一种功能,它在C#中没有匹配(或者至少是我所知道的)。如果你能告诉我如何在C#中做同样的技巧,那就太棒了。

1 个答案:

答案 0 :(得分:4)

在Java中称为匿名类。它实际上只是一个没有名称的类实现,它会覆盖ToString()

能够在C#中使用普通的命名类 - 唯一的问题是,DateTime是C#中的结构,所以你不能继承它。

C#确实有匿名类型,但与Java不同。在C#中,您可以使用匿名类型并指定其属性,但不能指定任何方法实现。因此,C#和Java中的匿名类型往往用于不同的事情。

修改

以下是如何在C#中执行此操作的示例,但如上所述,您无法在C#中的DateTime(或其他struct或密封类)上执行此操作。所以为了这个例子;我正在使用一个名为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;
    }
}