gpt4 book ai didi

java - JUnit 断言是否会被禁用?

转载 作者:行者123 更新时间:2023-12-01 22:10:49 24 4
gpt4 key购买 nike

Java 断言语句根据配置标志(例如 -ea)有选择地启用/禁用。我在网上读到,使用 JUnit 断言(例如,Assert.assertTrue),您无需担心自己管理断言配置。这到底是什么意思?要么:

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

2) JUnit 测试框架在运行 JUnit 测试时自动启用所有 JUnit 断言。每当应用程序/代码在 JUnit 外部运行时,JUnit 断言方法根本不执行任何操作。

3) JUnit 断言默认始终启用/禁用,但有一个自定义配置/标志可用于禁用/启用它们

以上哪项是正确的?

--

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

最佳答案

这个问题似乎引发了关于何时使用/不使用断言的编码指南的一系列蠕虫。我将在这里发布有关 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 )。应用程序因断言错误而失败。

  5. 添加 Assert.assertTrue(false); 引发错误并在禁用断言的情况下运行( -da )。应用程序因断言错误而失败。

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

结论:assert可以使用 -ea 命令行标志启用/禁用关键字。无法启用/禁用 JUnit.Asserts。如果您想将断言添加到生产代码中,那么这将成为一个非常重要的区别。如果您希望能够禁用它们,请使用 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

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

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

  • <小时/>

    相关 StackOverflow 讨论:

    assert vs. JUnit Assertions

    关于java - JUnit 断言是否会被禁用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31898941/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com