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