如何在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 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" }