为什么 Groovy 的 power assert 会打印两次失败消息?

Why Groovy's power assert prints failure messages twice?

$ groovy -e 'assert 1 == 2'
Caught: Assertion failed: 

assert 1 == 2
         |
         false

Assertion failed: 

assert 1 == 2
         |
         false

        at script_from_command_line.run(script_from_command_line:1)

为什么会这样? disable/configure这怎么行?

当我正在处理一个简单的脚本并想在它的末尾写一些断言并且 execute/test Vim 中的脚本 [=12] 时,接收两次输出有点烦人=]

虽然晚了,但是,为了它的价值......以及为了子孙后代:)

请注意消息第一次出现时的 Caught: 前缀。当脚本抛出异常(未捕获)时,默认情况下 groovy 打印(到 stderr)此前缀、异常的 toString() 及其堆栈跟踪,然后它退出。

因此,我会说消息的第一次出现表示未捕获异常的 "default" 行为/错误处理,而第二次出现是由于 "special" 处理 PowerAssertionError Groovy 中的 s / assert 关键字,即简单地打印错误的 toString().

使用像下面的 ok() 这样的方法验证这个 "theory" 并给出双重消息问题的可能解决方案:

def ok(assertion) {
    try {
        assert assertion
    } catch(AssertionError assertionError) {
        System.err.println(assertionError)
    }
}

据我所知,这仍然是 Groovy 2.5.0.

中的行为

编辑

不幸的是,通过像 ok 1 == 2 这样使用上面的 ok() 方法,您丢失了关于失败断言的最重要信息,因为输出变成了以下几行:

Assertion failed:

assert assertion
       |
       false

更好的解决方案(或者更确切地说是解决方法)是将断言包装在闭包中并将其传递给 ok() 方法:

def ok(Closure<?> assertionExp) {
    try {
        assertionExp?.call()
    } catch(AssertionError assertionError) {
        System.err.println(assertionError)
    }
}

使用 ok() 变为:

ok { assert 1 == 2 }

产生输出:

Assertion failed:

assert 1 == 2
         |
         false