为什么Groovy的电源断言打印失败消息两次?

时间:2016-05-27 09:18:46

标签: groovy console assert

$ 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 %

在Vim中执行/测试脚本时,接收输出两次会有点刺激性

1 个答案:

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