有a Negative Groovy Assert with Message之类的:
def name = "John"
assert name == "Peter" : "Name should be John"
提供输出:
Caught: java.lang.AssertionError: Name should be John. Expression: (name == Peter). Values: name = John
java.lang.AssertionError: Name should be John. Expression: (name == Peter). Values: name = John
但如果语句为true
,则日志中没有信息。因此,当您(或您的同事)稍后检查日志(同事不知道您实施的检查)时,您不知道有哪些断言。
所以我想记录正面断言。类似的东西(添加正面消息? "Name is " + name
):
def name = "Peter"
assert name == "Peter" : "Name should be John" ? "Name is " + name
它存在吗?我知道我可以在断言之后记录消息,例如:log("Assert is correct: Name is " + name)
但是我想在一行断言中做到这一点。
答案 0 :(得分:8)
没有积极的断言信息,因为它一般没有多大意义。让我们考虑您发布的示例:
assert name == "Peter" : "Name should be John" ? "Name is " + name
当表达式name == "Peter"
评估为false
时,发生的事情很简单 - java.lang.AssertionError
会抛出消息Name should be John
。在这种情况下,正分支并不简单 - 消息Name is ${name}
应该记录在哪里?使用简单的println
或使用slf4j的log.info()
或log.debug
?关于那个的明确决定在哪里?如果我不希望在我的日志中有这样的信息,因为它只产生开销会怎么样?
当然,你可以定义自己的方法,如:
void doAssert(boolean expr1, String errorMessage, Closure<Void> onSuccess = null) {
assert expr : errorMessage
onSuccess?.call()
}
然后执行:
doAssert name == "Peter", "Name should be John", {
log.info("Name is ${name}")
}
但从长远来看,这可能是一种过度杀伤 - 你只为一些调试信息创建一个闭包对象。您始终可以修改此方法并注释掉onSuccess?.call()
以限制在调用闭包时创建的一些开销,尽管无论如何都会创建闭包的对象(以及相关的Java匿名类)。
但是我猜你看到上面的方法需要完全相同的努力:
assert name == "Peter" : "Name should be John"
log.info("Name is ${name}")
我宁愿建议使用断言,因为它们的设计并不会产生太多开销。您可以随时记录重要信息,但必须是维护者有意义的事情。我没有看到获得特定断言得到满足的通知有多大价值 - 我知道因为程序继续计算。希望它能帮助您做出正确的决定。