为什么 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
$ 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