【问题标题】:Is it okay to use Junit Assert API in Java production code在 Java 生产代码中使用 Junit Assert API 可以吗
【发布时间】:2013-07-12 17:20:23
【问题描述】:

我想对我的方法参数进行空检查,比如参数不应该为空。可以在我的 Java 代码中使用类似 assertNotNull("Map should not be null", filePaths); 的东西吗? 我尽量避免

if(filePaths == null){
  throw new IllegalArgumentException("Maps cannot be null");
}

只是为了让我的代码免受所有这些 null 检查的影响。我知道我可以编写自己的 Validator 类并重载了 notNull 方法,但是是否存在一些现有且易于使用的东西,无需重新发明轮子。

我看到使用 JUnit Assert 的唯一缺点是它会抛出 AssertionError 而不是 IllegalArgumentException 等等。

【问题讨论】:

  • 为什么不用 Guava 的Preconditions
  • 另一种选择是使用 Java 语言提供的 assert 关键字——例如,assert null != filepaths : "Maps cannot be null"。这些检查可以在启动时打开或关闭。
  • @AndyThomas:不要在公共方法中使用断言来检查参数。来自Documentation。如果断言被禁用,它将永远不会被调用
  • @LouisWasserman:感谢您的建议,我们目前没有使用Guava,但看起来值得一试
  • @Learner - 好点。在某些特殊情况下,我将 assert() 用于非公共方法。但通常最好坚持单一方法,例如 Louis 对 Guava 的前提条件的建议。

标签: java exception exception-handling junit illegalargumentexception


【解决方案1】:

如果你使用 Java 7+,你可以使用:

Objects.requireNonNull(filePaths, "Map should not be null");

还有一个 null 参数,我希望出现 NullPointerException 或 IllegalArgumentException,但不是 AssertionError。

【讨论】:

  • 感谢您的回复。我们仍在使用 Java 6,但很高兴知道它内置于 Java 7
  • @Learner 使用 Java 6,您可以使用前面已经指出的 Guava Preconditions(它的作用与 Objects.requireNonNull 大致相同)。
【解决方案2】:

不,不可以使用。 JUnit 断言方法抛出一个AssertionError。在生产代码中抛出Error 不是一个好主意。来自 javadoc:

错误是 Throwable 的子类,表示存在严重问题 一个合理的应用程序不应该试图捕捉。大多数这样的 错误是异常情况。 ThreadDeath 错误,虽然是 “正常”条件,也是 Error 的子类,因为大多数 应用程序不应该试图抓住它。不需要方法 在其 throws 子句中声明任何可能的 Error 子类 在方法执行期间抛出但未被捕获,因为这些 错误是不应该发生的异常情况。也就是说,错误 及其子类被视为未经检查的例外 编译时检查异常的目的。

【讨论】:

  • 即使我自己编写验证,我仍然会在生产代码中抛出 IllegalArgumentException。哦,你的意思是抛出 Exception 而不是 Error
  • 正确,我的意思是不要抛出错误而不是异常。
猜你喜欢
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
  • 2011-05-20
  • 1970-01-01
  • 2015-08-26
  • 1970-01-01
相关资源
最近更新 更多