89

今天我看到一个使用 java 断言而不是 JUnit 断言的 JUnit 测试用例——偏爱一个比另一个有明显的优点或缺点吗?

4

6 回答 6

100

在 JUnit4 中,JUnit 断言抛出的异常(实际上是错误)与 javaassert关键字(AssertionError)抛出的错误相同,因此它与堆栈跟踪完全相同,但assertTrue您无法区分。

话虽如此,断言必须在 JVM 中使用特殊标志运行,这导致许多测试似乎通过,因为有人在运行 JUnit 测试时忘记使用该标志配置系统 - 不好。

一般来说,正因为如此,我认为使用 JUnitassertTrue是更好的做法,因为它可以保证测试运行,确保一致性(您有时使用assertThat或其他不是 java 关键字的断言)以及如果 JUnit 的行为断言将来应该更改(例如挂钩某种过滤器或其他未来的 JUnit 功能)您的代码将能够利用它。

在 java 中 assert 关键字的真正目的是能够在没有运行时损失的情况下将其关闭。这不适用于单元测试。

于 2010-06-03T13:38:43.583 回答
26

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

于 2010-06-03T13:29:56.900 回答
21

当测试失败时,您将获得更多信息。

assertEquals(1, 2);结果是java.lang.AssertionError: expected:<1> but was:<2>

对比

assert(1 == 2);结果是java.lang.AssertionError

如果您将消息参数添加到assertEquals

于 2011-06-07T14:57:11.283 回答
8

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

于 2012-04-27T21:36:38.047 回答
0

我会说如果你使用 JUnit,你应该使用 JUnit 断言。assertTrue()基本上是一样的assert,不然为什么还要用JUnit呢?

于 2010-06-03T13:30:52.280 回答
0

如果您专门使用闪亮和新的东西,这可能不适用,但直到 1.4SE 才将断言引入 Java。因此,如果您必须在使用旧技术的环境中工作,出于兼容性原因,您可能会倾向于使用 JUnit。

于 2010-06-03T14:09:08.923 回答