我正在使用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
而且也不能使用任何方法expected
和actual
未上找到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”,有时不会。此外,
问题内容: 今天,我看到了一个带有Java断言而不是JUnit断言的JUnit测试用例-相对于另一个而言,优先选择一个优点还是缺点? 问题答案: 在JUnit4中,JUnit断言引发的异常(实际上是Error)与java 关键字(AssertionError)引发的错误相同,因此它与堆栈跟踪完全相同,除了您无法分辨出其区别。 话虽这么说,断言必须在JVM中使用特殊标志运行,导致许多测试似乎通过了,
问题内容: 为什么不通用? 好像有 然后,当你不小心尝试从中删除(例如)而不是每个时,这将是编译时错误,而不是以后的调试问题。 问题答案: (Map以及中的)不是通用的,因为你应该能够将任何类型的对象传递给。删除的对象不必与你传递给的对象具有相同的类型;它只要求它们相等。从本说明书中,将删除对象e,使得是true。请注意,没有什么要求,o并且e必须是相同的类型。这是因为该方法接受一个参数,而不仅仅