一个很好的断言类供生产使用? Java相当于Groovy的PowerAssert?

时间:2012-02-07 12:28:30

标签: java groovy assert contracts preconditions

我不喜欢java assert关键字,因为它并不总是在生产代码中启用。我正在寻找一个好的“ProductionAssert”类,它总是运行着名的断言。

一名候选人是Guava's Preconditions。它很不错,但有点受限(例如没有assertEquals()assertNull()assertGreaterEquals())。

一种替代方案是包含jUnit或其他测试框架......但我不愿意仅仅为了一个简单的断言类而依赖于整个测试框架。

如果我在Groovy中编程,我会使用PowerAssert

Java是否有一个好的“ProductionAssert”类?

P.S。 - 一个选项是最终查看类似Java Contracts的内容...但是我现在正在寻找的是绝对最小,零摩擦,只需放入它而不需要在构建过程类型中进行任何更改class ...我不确定合同符合这种描述。

4 个答案:

答案 0 :(得分:3)

我倾向于使用Spring的Assert类:

public void thing(String foo){
    Assert.hasText(foo, "'foo' is required");
}

显然,如果你不使用弹簧那么这不会漂浮你的船,我不确定它是否比番石榴更好。

答案 1 :(得分:3)

我会使用Junit。它旨在使用这些测试。

另一种选择是确保始终打开断言。即如果您无法控制您的生产环境。如果不是,您可以导致程序失败。

boolean assertOn = false;
assert assertOn = true;
if (!assertOn) 
   throw new AssertionError("Assertions must be turned on");

第三种选择是自己编写这些方法。通常只有两行代码。这样他们就可以做你想做的一切。

答案 2 :(得分:1)

Spring在spring-core模块中有一个Assert


答案 3 :(得分:0)

您可以将valid4j与hamcrest-matchers一起使用(在Maven Central上找到org.valid4j:valid4j)。默认提供程序抛出AssertionError,但如果需要,您可以注册自己的自定义全局策略。

对于前置条件(如断言):

import static org.valid4j.Assertive.*;

require(x, greaterThan(0)); // throws RequireViolation extends AssertionError

使用'ensure'对后置条件的类似支持。

旁注:您也可以使用相同的库进行常规输入验证(即抛出可恢复的异常):

import static org.valid4j.Validation.*;

validate(argument, isValid(), otherwiseThrowing(InvalidException.class));

链接: