基于配置标志(例如,-ea)有选择地启用/禁用Java断言语句。我在网上看到,使用JUnit断言(例如,Assert.assertTrue),您不必担心自己管理断言配置。这到底是什么意思?之一:
1)永远不会禁用JUnit断言(与Prod代码混合在一起)。它们的行为与Validate语句类似,并且始终可以运行。
或
2)JUnit测试框架在运行JUnit测试时自动启用所有JUnit断言。每当应用程序/代码在JUnit之外运行时,JUnit断言方法都不执行任何操作。
或
3)默认情况下,JUnit断言始终处于启用/禁用状态,但是有一个自定义配置/标志可用于禁用/启用它们
以上哪项是真的?
-
编辑:改变了措辞,以消除任何歧义。
答案 0 :(得分:2)
关于何时使用/不使用断言的编码指南,这个问题似乎已经开辟了一堆蠕虫。我将在这里发布关于JUnit Assert语句是否被禁用的直接问题的答案。再往下,您将找到关于使用断言的哲学方面的讨论。
总结:即使在生产中使用disable-assertions标志运行,JUnit断言语句也永远不会被禁用。
实验:创建了一个小的主函数,它在第一行引发错误。错误以各种不同的方式实现。然后我从命令行运行应用程序,如:mvn clean package; java $JAVA_OPTS -cp ....
通过抛出IllegalArgument异常引发错误。应用程序因IllegalArgument异常而失败。
通过添加assert false
引发错误并在启用断言的情况下运行(-ea
)。申请失败。
通过添加assert false
引发错误并在禁用断言(-da
)的情况下运行。申请成功。
通过添加Assert.assertTrue(false);
引发错误并在启用断言的情况下运行(-ea
)。应用程序因AssertionError而失败。
通过添加Assert.assertTrue(false);
引发错误并在禁用断言(-da
)的情况下运行。应用程序因AssertionError而失败。
快速谷歌搜索是否有任何方法可以禁用JUnit.Asserts。没找到任何东西。如果有人知道这样做的方法,请告诉我,因为我认为这是一个重要的区别。
结论:可以使用-ea命令行标志启用/禁用assert
个关键字。无法启用/禁用JUnit.Asserts。如果要将断言添加到生产代码中,那么这将成为一个非常重要的区别。如果您希望能够禁用它们,请使用assert
关键字。如果你想要总是启用你知道的东西,那么考虑JUnit.Assert,或者抛出AssertionErrors的其他类似框架。
关于断言用法背后的哲学:
将断言纳入您的代码。在许多情况下,使用断言是好的,包括: 内部不变量 控制流不变量 前置条件,后置条件和类不变量
JUnit Asserts不能被视为java assert
关键字的通用替代品。后者赋予你禁用它们的能力,前者没有。因此,在选择使用2中的哪一个时,有一个设计选择。
异常和断言服务于非常不同的目的,不应互换使用。以下讨论进一步阐明了这一点:When to use an assertion and when to use an exception
相关的StackOverflow讨论:
答案 1 :(得分:1)
我认为你在JUnit断言和Java内置断言之间感到困惑。
JUnit断言是抛出AssertionError
异常的方法,只应在测试代码中使用。只有在构建期间/之间运行JUnit测试时,才应在生产中使用JUnit代码。方法名称的名称类似于assertEquals( expected, actual)
和assertNull(Object)
等。您无法禁用这些断言,因为它们是方法调用。如果您可以禁用所有JUnit断言方法调用,那么您的测试代码将毫无用处。
Java内置的断言是一个以assert
关键字开头的布尔表达式。如果表达式返回false,则它也抛出AssertionError
。可以在生产中禁用此类断言以帮助加速代码或打开以帮助追踪错误。您可以阅读有关内置Java断言in the Java Programming Guide