我不喜欢java assert
关键字,因为它并不总是在生产代码中启用。我正在寻找一个好的“ProductionAssert”类,它总是运行着名的断言。
一名候选人是Guava's Preconditions。它很不错,但有点受限(例如没有assertEquals()
,assertNull()
,assertGreaterEquals()
)。
一种替代方案是包含jUnit或其他测试框架......但我不愿意仅仅为了一个简单的断言类而依赖于整个测试框架。
如果我在Groovy中编程,我会使用PowerAssert。
Java是否有一个好的“ProductionAssert”类?
P.S。 - 一个选项是最终查看类似Java Contracts的内容...但是我现在正在寻找的是绝对最小,零摩擦,只需放入它而不需要在构建过程类型中进行任何更改class ...我不确定合同符合这种描述。
答案 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));
链接: