为什么JUnit在Java中断言方法不通用?

我正在使用JUnit 4.12。 断言方法本质上不是通用的。 例如,assertEquals方法如下所示:

static public void assertEquals(Object expected, Object actual) {..} 

为什么不喜欢?

 static public  void assertEquals(T expected, T actual) {..} 

我觉得需要通用方法声明来更好地编译时间和IDE自动完成。

有这样的通用方法:

  void assertEquals(T expected, T actual) { /* ... */ } 

为了避免比较不同的类型,你没有类型安全性:你可以将任何东西传递给这个方法,因为T退化到它的上界, Object

 assertEquals("string", 0); // Compiles fine, even though they can't be equal. 

Ideone演示

并且你也不能使用在Object找不到的任何expectedactual方法。 所以, T基本上只是Object

因此,添加generics只会使实现过于复杂。


现在,您可以定义一个这样的类:

 class GenericAssert { void assertEquals(T expected, T actual) { /* ... */ } } 

你可以这样使用:

 new GenericAssert().assertEquals("string", 0); // Compiler error. 

因为你现在已经在类级别上对assertEquals的可接受参数设置了更严格的上限。

但这感觉有点尴尬。

你想看看断言和Hamcrest匹配器; as assertThat实际上适用于generics:

 assertThat(String reason, T actual, Matcher matcher) 

所以:

 assertEquals("abc", 123); 

编译,但失败; 而

 assertThat(123, is("abc")); 

甚至不会编译!

我甚至没有提到asser这些电话要好得多; 当失败时提供更好的信息。 您甚至可以使用它们来比较地图,集合等等。

长话短说:只有一个断言,任何人都需要 – 断言那就是!