JUnit Assertions会被禁用吗?

时间:2015-08-08 21:51:02

标签: java exception junit assert

基于配置标志(例如,-ea)有选择地启用/禁用Java断言语句。我在网上看到,使用JUnit断言(例如,Assert.assertTrue),您不必担心自己管理断言配置。这到底是什么意思?之一:

1)永远不会禁用JUnit断言(与Prod代码混合在一起)。它们的行为与Validate语句类似,并且始终可以运行。

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

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

以上哪项是真的?

-

编辑:改变了措辞,以消除任何歧义。

2 个答案:

答案 0 :(得分:2)

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

总结:即使在生产中使用disable-assertions标志运行,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而失败。

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

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

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

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

      将断言纳入您的代码。在许多情况下,使用断言是好的,包括:   内部不变量   控制流不变量   前置条件,后置条件和类不变量

      1. JUnit Asserts不能被视为java assert关键字的通用替代品。后者赋予你禁用它们的能力,前者没有。因此,在选择使用2中的哪一个时,有一个设计选择。

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

      3. 相关的StackOverflow讨论:

        assert vs. JUnit Assertions

答案 1 :(得分:1)

我认为你在JUnit断言和Java内置断言之间感到困惑。

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

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

  3. 的更多信息