Groovy中是否存在肯定的断言消息?

Groovy中是否存在肯定的断言消息?,groovy,assertions,Groovy,Assertions,有这样的情况: 其输出: 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,则日志中没有任何信息。因此,当您(或您的同事)

有这样的情况:

其输出:

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
):


它存在吗?我知道我可以在断言之后记录消息,例如:
log(“断言是正确的:名称是”+Name)
,但我想在一行断言中这样做。

没有像肯定断言消息这样的东西,因为它在一般情况下没有多大意义。让我们考虑一下你已经发布的例子:

assert name == "Peter" : "Name should be John" ? "Name is " + name
当表达式
name==“Peter”
计算结果为
false
时,发生的事情很简单-
java.lang.AssertionError
与消息一起抛出
name should is John
。本例中的正向分支并不简单-消息
Name是${Name}
应该记录到哪里?使用simple
println
或可能使用slf4j的
log.info()
log.debug
?明确的决定在哪里?如果我不想在日志中包含这样的信息,因为它只会产生开销,该怎么办

当然,您可以定义自己的方法,如:

void doAssert(boolean expr1, String errorMessage, Closure<Void> onSuccess = null) {
    assert expr : errorMessage
    onSuccess?.call()
}
但从长远来看,这可能是一种过分的做法——您只为一些调试信息创建一个闭包对象。您始终可以修改此方法并注释掉
onSuccess?.call()
,以限制调用闭包时产生的一些开销,尽管闭包的对象(以及相关的Java匿名类)仍然会被创建

但我想你会发现,上述方法所需的工作量与:

assert name == "Peter" : "Name should be John"
log.info("Name is ${name}")

我宁愿建议使用断言,因为它们是经过设计的,不会产生太多开销。您可以随时记录重要信息,但它必须对维护人员有意义。我不认为得到满足特定断言的信息有多大价值——我知道这是因为程序继续计算。希望它能帮助你做出正确的决定。

如果它很重要,那就做一个明确的日志。总有一天,有人会用正确的错误检查来替换断言,然后这个重要的日志可能会过时。
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}")
}
assert name == "Peter" : "Name should be John"
log.info("Name is ${name}")