如何在Groovy中从断言的方法或闭包打印语句

如何在Groovy中从断言的方法或闭包打印语句,groovy,assertion,Groovy,Assertion,是否有可能将闭包或方法中的语句内联到断言中,以便在断言失败时打印该语句 如果我们有一个简单的语句,比如assert 10==(20-11),那么Groovy的power assert很好地将其打印出来,如下所示: assert 10 == (20 - 11) | | false 9 但是,如果我们将语句提取到一个闭包中,如: def c = { arg -> arg == (20 - 11) } assert c(10) 那么,输出的

是否有可能将闭包或方法中的语句内联到断言中,以便在断言失败时打印该语句

如果我们有一个简单的语句,比如
assert 10==(20-11)
,那么Groovy的power assert很好地将其打印出来,如下所示:

assert 10 == (20 - 11)
          |      |
          false  9
但是,如果我们将语句提取到一个闭包中,如:

def c = { arg -> arg == (20 - 11) }
assert c(10)
那么,输出的信息量就会少得多:

assert c(10)
       |
       false

我正在开发自定义特定测试框架,用例是将自定义断言表示为布尔闭包或方法,并从一个位置运行断言。

您得到这样的输出,因为,
closure
返回布尔值,
assert
确实查找
true

方法#1:如果您想要更改输出,那么您可以将两个参数传递给
闭包
,而不是下面所示的一个参数。当然,您可能不想在框架中比较等式和静态数,所以第二个参数是有意义的

def c = { arg1, arg2 -> arg1 == arg2 }  
assert c(10, 20-11), 'comparison failed'
输出:

java.lang.AssertionError:比较失败。表达式:c.call(10,(20-11)) 在Script1.run(Script1.groovy:2)

方法#2:此处适当更改了闭包名称,并在其内部执行断言。由于它的名称是
assertEqual
,因此它不太可能被误用于其他断言,例如
表达式(arg1,arg2)}
//大于
myAssert(10,20-11){op1,op2->assert op1>op2,“$op1不大于$op2”}
//少于
myAssert(10,20-11){op1,op2->assert op1assert op1==op2,“$op1不等于$op2”}
输出:

java.lang.AssertionError:10不小于9。表达:(op1 在Script1$\u run\u closure2.doCall(Script1.groovy:2)
在Script1$\u run\u closure1.doCall(Script1.groovy:1)
在Script1.run(Script1.groovy:2)


如果您想使用简单的方法,只需使用
equal
assert,那么方法#2就是正确的方法。当然,你最好选择最适合你需要的。

谢谢你的全面回答。我目前正在使用第二种方法,因为断言必须很好地封装。考虑布尔断言而不是内部带有assert语句的断言的原因是为了很好地支持集合的断言,如anyMatch等。但是,如果不容易实现,我可以不使用布尔断言,并以不太漂亮的方式实现它。如果这有帮助,请接受上述答案。
def assertEqual = { arg1, arg2 -> assert arg1 == arg2, "Comparison failed: ${arg1} vs ${arg2}" }  
assertEqual(10, 20-11)
def assertEqual = { arg1, arg2, message -> assert arg1 == arg2, message(arg1, arg2) }
assertEqual(10, 20-11) {op1, op2 -> "$op1 is not equal to $op2"}
def myAssert = { arg1, arg2, expression -> expression(arg1, arg2) }
//Greater than
myAssert(10, 20-11) {op1, op2 -> assert op1 > op2, "$op1 is not greater than $op2" }
//Less than
myAssert(10, 20-11) {op1, op2 -> assert op1 < op2, "$op1 is not less than $op2" }
//Equal
myAssert(10, 20-11) {op1, op2 -> assert op1 == op2, "$op1 is not equal to $op2" }