$ 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)
为什么会这样?如何禁用/配置?
当我处理一个简单的脚本并希望在其末尾编写一些断言并使用!groovy %
答案 0 :(得分:2)
倒是晚了,但是,为了它的价值……以及后代:)
在第一次出现消息时注意 Caught:前缀。当脚本引发异常(未捕获)时,默认情况下,groovy
打印(到 stderr )此前缀,异常的toString()
及其堆栈跟踪,然后退出。
因此,我想说消息的第一次出现代表未捕获异常的“默认”行为/错误处理,而第二次是由于对PowerAssertionError
s / {{1}的“特殊”处理}关键字在Groovy中,即仅打印错误的assert
。
使用下面的toString()
之类的方法验证此“理论”,并为双重消息问题提供可能的解决方案:
ok()
据我所知,这仍然是Groovy 2.5.0中的行为。
编辑
不幸的是,通过使用像def ok(assertion) {
try {
assert assertion
} catch(AssertionError assertionError) {
System.err.println(assertionError)
}
}
这样的ok()方法,您会丢失关于失败的断言的最重要的信息,因为输出会变成类似这样的东西:
ok 1 == 2
更好的解决方案(或更确切地说,解决方法)是将断言包装在闭包中,并将其传递给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 }