def name = "John"
assert name == "Peter" : "Name should be John"
Run Code Online (Sandbox Code Playgroud)
这给出了输出:
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
Run Code Online (Sandbox Code Playgroud)
但如果声明是true日志中没有信息.因此,当您(或您的同事)稍后检查日志(同事不知道您实施的检查)时,您不知道有哪些断言.
所以我想记录积极的断言.像(添加积极的消息? "Name is " + name):
def name = "Peter"
assert name == "Peter" : "Name should be John" ? "Name is " + name
Run Code Online (Sandbox Code Playgroud)
它存在吗?我知道我可以在断言之后记录消息,例如:log("Assert is correct: Name is " + name)但我想在一行断言中做到这一点.
没有积极的断言信息,因为它一般没有多大意义.让我们考虑一下您发布的示例:
assert name == "Peter" : "Name should be John" ? "Name is " + name
Run Code Online (Sandbox Code Playgroud)
当表达式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()
}
Run Code Online (Sandbox Code Playgroud)
然后做:
doAssert name == "Peter", "Name should be John", {
log.info("Name is ${name}")
}
Run Code Online (Sandbox Code Playgroud)
但从长远来看,这可能是一种过度杀伤 - 你只为一些调试信息创建一个闭包对象.您始终可以修改此方法并注释掉onSuccess?.call()以限制在调用闭包时创建的一些开销,尽管无论如何都会创建闭包的对象(以及相关的Java匿名类).
但我猜你看到上面的方法需要完全相同的努力:
assert name == "Peter" : "Name should be John"
log.info("Name is ${name}")
Run Code Online (Sandbox Code Playgroud)
我宁愿建议使用断言,因为它们被设计并且不会产生太多开销.您可以随时记录重要信息,但必须是维护者有意义的事情.我没有看到获得特定断言得到满足的通知有多大价值 - 我知道因为程序继续计算.希望它能帮助您做出正确的决定.
| 归档时间: |
|
| 查看次数: |
790 次 |
| 最近记录: |