JUnit 断言会被禁用吗?

Do JUnit Assertions ever get disabled?

Java 断言语句是有选择的 enabled/disabled,基于配置标志(例如,-ea)。我在网上看到,使用 JUnit 断言(例如,Assert.assertTrue),您无需担心自己管理断言配置。这到底是什么意思?或者:

1) JUnit 断言(与 Prod 代码混合在一起)永远不会被禁用。它们的行为就像 Validate 语句一样,并且总是得到 运行.

2) JUnit 测试框架在 运行ning JUnit 测试时自动启用所有 JUnit 断言。只要 application/code 在 JUnit 之外是 运行,JUnit 断言方法就什么都不做。

3) 默认情况下,JUnit 断言总是 enabled/disabled,但有一个自定义 config/flag 可用于 disable/enable 它们

以上哪项是正确的?

--

编辑:稍微更改了措辞以消除歧义。

我认为您对 JUnit 断言和 Java 的内置断言感到困惑。

  1. JUnit 断言是抛出 AssertionError 异常的方法,只能在您的测试代码中使用。 JUnit 代码不应在生产中使用,仅当 运行 您的 JUnit 测试 during/between 构建时。方法名称命名为 assertEquals( expected, actual)assertNull(Object) 等。您不能禁用这些断言,因为它们是方法调用。如果您可以禁用所有 JUnit 断言方法调用,那么您的测试代码也将毫无用处。

  2. Java 的内置断言是一个以 assert 关键字开头的布尔表达式。如果表达式 returns 为假,那么它也会抛出一个 AssertionError。这种断言可以在生产中禁用以帮助加速您的代码或打开以帮助追踪错误。您可以阅读有关内置 Java 断言 in the Java Programming Guide

  3. 的更多信息

关于何时 use/not 使用断言的编码指南,这个问题似乎已经打开了一堆蠕虫。我将 post 在这里回答我关于 JUnit Assert 语句是否被禁用的直接问题。再往下,您会发现关于使用断言的哲学方面的讨论。


总结:JUnit 断言语句永远不会被禁用,即使 运行 在生产中使用禁用断言标志也是如此。

实验:创建了一个在第一行抛出错误的小主函数。该错误以各种不同的方式实施。然后我从命令行 运行 应用程序,如下所示:mvn clean package; java $JAVA_OPTS -cp ....

  1. 通过抛出 IllegalArgument 异常引发错误。应用程序因 IllegalArgument 异常而失败。

  2. 通过添加启用断言的 assert false 和 运行 引发错误 (-ea)。申请失败。

  3. 通过添加 assert false 和 运行 并禁用断言 (-da) 引发错误。申请成功

  4. 通过添加 Assert.assertTrue(false); 和 运行 并启用断言 (-ea) 引发错误。应用程序因 AssertionError 失败。

  5. 通过添加 Assert.assertTrue(false); 和 运行 并禁用断言 (-da) 引发错误。应用程序因 AssertionError 失败。

快速 google 搜索以查看是否有任何方法可以禁用 JUnit.Asserts。没找到任何东西。如果有人知道这样做的方法,请告诉我,因为我相信这是一个重要的区别。

结论:assert 关键字可以 enabled/disabled 使用 -ea 命令行标志。 JUnit.Asserts 不能是 enabled/disabled。如果您想将断言添加到您的生产代码中,那么这将成为一个非常重要的区别。如果您想禁用它们,请使用 assert 关键字。如果您想要某些您知道将始终启用的东西,请考虑 JUnit.Assert,或其他一些抛出 AssertionErrors 的类似框架。


关于断言用法背后的哲学:

  1. 最好向生产代码中添加某种形式的断言。参见:https://docs.oracle.com/javase/8/docs/technotes/guides/language/assert.html#usage

Putting Assertions Into Your Code. There are many situations where it is good to use assertions, including: Internal Invariants Control-Flow Invariants Preconditions, Postconditions, and Class Invariants

  1. JUnit 断言不能被视为 java assert 关键字的通用替代品。后者赋予您禁用它们的能力,而前者则没有。因此,在选择使用两者中的哪一个时需要做出设计选择。

  2. 异常和断言的用途截然不同,不应互换使用。以下讨论进一步阐明了这一点:When to use an assertion and when to use an exception


相关 Whosebug 讨论:

assert vs. JUnit Assertions