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

时间:2018-01-18 09:47:52

标签: groovy assertions

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)但是我想在一行断言中做到这一点。

1 个答案:

答案 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}")

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