当前位置: 首页 > 面试题库 >

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

魏毅
2023-03-14
问题内容

我正在使用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

而且也不能使用任何方法expectedactual未上找到Object。因此,T基本上就是Object

这样,添加泛型只会使实现变得过于复杂。

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

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

你可以这样使用:

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

因为您现在assertEquals在类级别将更严格的上限放在的可接受参数上。

但这感觉有点尴尬。



 类似资料:
  • null 正确的方法是不间断地睡眠。

  • 我是JUnit新手,尝试在我的遗留代码库中实现它<当我测试hibernateEntity时,我应该断言什么。save()

  • 问题内容: 有人知道为什么JUnit 4提供但不提供方法吗? 它提供了(对应于)和(对应于),因此它们似乎没有包含在内就显得很奇怪。 顺便说一下,我知道JUnit插件提供了我正在寻找的方法。我只是出于好奇而问。 问题答案: 我建议您使用较新的样式断言,该断言可以轻松描述各种否定形式,并在断言失败时自动构建对您的期望和得到的结果的描述: 这三个选项都是等效的,请选择最容易阅读的一个。 要使用方法的简

  • 我想优雅地关闭一个线程。然而,一旦关闭被启动,线程应该在结束通常的操作后执行一些关闭操作。 两个线程都使用Hibernate和/或等待,并处理中断异常,它们还在一个循环中处理任务,只需要几毫秒。所以我期望while循环结束,因为Thread.currentThread()。isInterrupted()变为“true”。 问题是,对于我的代码,有时我会得到日志“SHUTDOWN”,有时不会。此外,

  • 问题内容: 为什么不通用? 好像有 然后,当你不小心尝试从中删除(例如)而不是每个时,这将是编译时错误,而不是以后的调试问题。 问题答案: (Map以及中的)不是通用的,因为你应该能够将任何类型的对象传递给。删除的对象不必与你传递给的对象具有相同的类型;它只要求它们相等。从本说明书中,将删除对象e,使得是true。请注意,没有什么要求,o并且e必须是相同的类型。这是因为该方法接受一个参数,而不仅仅

  • 问题内容: 今天,我看到了一个带有Java断言而不是JUnit断言的JUnit测试用例-相对于另一个而言,优先选择一个优点还是缺点? 问题答案: 在JUnit4中,JUnit断言引发的异常(实际上是Error)与java 关键字(AssertionError)引发的错误相同,因此它与堆栈跟踪完全相同,除了您无法分辨出其区别。 话虽这么说,断言必须在JVM中使用特殊标志运行,导致许多测试似乎通过了,