断言与JUnit断言

今天,我看到了一个JUnittesting用例,其中包含一个java断言,而不是JUnit断言 – 相对于另一个而言,是否有显着的优点或缺点?

在JUnit4中,由JUnit断言引发的exception(实际上是Error)与由java assert关键字(AssertionError)抛出的错误是一样的,所以它与assertTrue完全相同,而且堆栈跟踪以外的东西不能区分。

这就是说,断言必须在JVM中运行一个特殊的标志,导致许多testing似乎通过,因为有人忘记configuration系统的JUnittesting时运行的标志 – 不好。

总之,因为这个原因,我认为使用JUnit assertTrue是更好的做法,因为它确保了testing运行,确保一致性(有时使用assertThat或其他不是java关键字的断言),并且如果JUnit断言在将来应该改变(例如挂钩某种filter或其他未来的JUnitfunction),您的代码将能够利用这一点。

在java中assert关键字的真正目的是能够closures它,而不会造成运行时损失。 这不适用于unit testing。

我更喜欢JUnit断言,因为它们提供了比内置的assert语句更丰富的API,更重要的是不需要显式启用,而不像assert ,这需要-ea JVM参数。

当一个testing失败,你会得到更多的信息。

assertEquals(1, 2); 导致java.lang.AssertionError: expected:<1> but was:<2>

VS

assert(1 == 2); 导致java.lang.AssertionError

如果将消息参数添加到assertEquals则可以获得更多信息

我会说在testing用例中使用JUnit断言,并在代码中使用java断言。 换句话说,真正的代码永远不会有JUnit依赖关系,如果它是一个testing,它应该使用它的JUnit变体,而不是断言。

我会说如果你使用JUnit,你应该使用JUnit断言。 assertTrue()assert基本相同,否则为什么要使用JUnit呢?

这可能不适用,如果你专门使用的东西是有光泽和新的,但断言没有被引入到Java之前的1.4SE。 因此,如果您必须在具有较旧技术的环境中工作,则可能因为兼容性原因而倾向于JUnit。