Assert的替代品

时间:2014-11-20 18:52:02

标签: java junit assert assertions

我对Java中的 assert 关键字不满意的原因是

1)默认情况下它已被禁用,因此在我希望它启用时确保启用它是一件令人头疼的事。

2)它的行为相当严格(理想情况下我想要一些控制反转);但这并不是非常重要。

我可以考虑的一些替代方案:

  1. JUnit&#39> assertEquals()等 - 适用于测试,但不能在主代码中使用
  2. 番石榴的先决条件 - 很好,但本身没有断言方法。
  3. 我自己的断言库 - 我在1999年写过它,当时它很棒,但现在我想要标准化。
  4. 还有别的吗?
  5. 所以...总结一下..如何在生产代码中以默认禁用的方式断言?

    (是的,这可能被某些人视为反模式,但我确实希望生产中至少有一些断言,即使断言失败只是默默地记录。即使在收缩包装中我也看到了一些空间,并且肯定在网站上。)

3 个答案:

答案 0 :(得分:1)

我使用的是Spring Assert课程,它包含了相当广泛的检查范围。

答案 1 :(得分:1)

我不确定这是否是你想要的,但我已经常规使用commons-lang Validate多年了。通常在公共API方法/构造函数中,以确保正确传递参数。不只是notNull(请参阅Lombok' s @NotNull),还有noNullElements等。

我特别喜欢不可变的<T> T notNull(T object)签名:

private final JSCodeModel codeModel;
private final String name;

public FunctionDeclarationImpl(JSCodeModel codeModel, String name,
        String[] parameterNames, JSSourceElement[] sourceElements) {
    this.codeModel = Validate.notNull(codeModel);
    this.name = Validate.notNull(name);
    ...
}

实际上你的要求是什么?

答案 2 :(得分:0)

  

JUnit的assertEquals()等 - 适用于测试,但不能在主代码中使用

在技术上,没有什么能阻止您在主代码中使用JUnit声明(和/或Hamcrest匹配器)。只需在类路径中包含Junit jar。它通常没有完成,但这比任何技术限制都更符合惯例。

Java 7还引入了Objects.requireNotNull(obj, message)和类似的方法,尽管不像JUnit断言那样功能齐全。

但我认为如果你想采用更标准化的方法,番石榴的先决条件可能是最好的。