java - 为什么 JUnit 断言方法在 Java 中不是通用的?

标签 java generics junit

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

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

为什么不像?

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

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

最佳答案

有一个像这样的通用方法:

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

不提供类型安全以避免比较不同的类型:您可以将任何内容传递给此方法,因为 T 退化为其上限,Object:

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

Ideone demo

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

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


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

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

你可以这样使用:

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

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

但这感觉有点尴尬。

关于java - 为什么 JUnit 断言方法在 Java 中不是通用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38787083/

相关文章:

java - 避免在聚合子模型上使用持久层

java - 线程似乎没有干净地退出 - 线程挂起

android - 如何在android中的单元测试和仪器测试之间共享资源?

java - 为什么我的 TreeMap 将以 'A' 开头的键移动到 keyValueSet 的末尾?

java - 什么是原始类型,为什么我们不应该使用它呢?

Scala Generics - ADT 中的通用提取器方法

generics - 为什么在关联类型上不识别除第一个之外的 super 特征边界?

eclipse - 在 Eclipse 中更改默认的 TestRunner

android - Android JUnit 测试中的运行时异常

java - Storm Flux 中的多个可调用构造函数