在Java中使用assert

时间:2011-05-06 13:45:34

标签: java assert

  

可能重复:
  Assert keyword in java
  assert vs. JUnit Assertions

我使用JUnit进行单元测试,但很多时候很难用JUnit来获取某些东西。我最近开始关注Java断言。

使用assert是一个好主意,你会如何推荐使用它?

3 个答案:

答案 0 :(得分:1)

最重要的是要使用断言和测试代码是两个不同的(如果可能是相关的)任务。

我认为断言docs几乎可以解释使用断言的情况。

答案 1 :(得分:1)

断言在没有异常处理的语言中很流行,用于进行检查以确保程序正常运行,从而使问题更容易诊断。

然而,如果断言触发,最恰当的行动原因可能会有些含糊不清。如果程序立即退出,则可能存在浪费的机会来更优雅地处理故障(例如,向用户报告故障并尝试恢复数据)。如果程序没有立即退出,由于错误,它可能处于未知状态,这也是不可取的。

因此,当给定条件失败时,在Java中抛出异常被认为是更好的做法,这可以为这些问题提供最好的解决方案。对于在程序正常运行期间可能发生的错误,检查的异常最合适。调用代码有义务处理这些错误。对于内部程序逻辑失败导致的错误,抛出RuntimeException将允许程序在调用堆栈中进一步处理失败。

断言确实有一个好处,即可以在开发中使用它们,但可以为消费者或发布版本“编译”,其中执行速度比早期检测和错误处理更重要。但是,需要这种特性的应用程序通常不是用Java构建的(更可能是C ++),这也是为什么断言在Java中很少见的原因。

(另外,我相信某些IDE默认情况下并不总是在运行时启用资产,所以很容易让断言失败并且不知道它。)

答案 2 :(得分:0)

是的,使用assert来验证程序运行时的正确性会很有用。我通常会根据fail-fast principle使用它来捕获错误,以主动检测错误。

典型的用例是操作成功。请考虑以下示例:

int nChanges = database.update(..);
assert(nChanges == 1);

我不会考虑将它用于参数验证或任何此类操作,这些操作应根据合同在常规代码中进行验证,因为它不会抛出相应的异常(并且运行时异常可能是有意义的)。类似地,我不会在测试中使用它,因为JUnit已经提供了断言机制,与常规断言语句不同,它不能被禁用。