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

Does positive assert message exist in Groovy?

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) 但我想在一行断言中完成。

没有像肯定断言消息这样的东西,因为一般来说它没有多大意义。让我们考虑您发布的示例:

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 匿名 class)无论如何都会创建。

但我猜你看到上面的方法需要完全相同的工作量:

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

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