[英]How to print statement from asserted method or closure in Groovy
是否有可能將閉包或方法中的語句內聯到斷言中,以便在斷言失敗時打印出來?
如果我們有像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
返回 boolean 並且assert
確實尋找true
。
方法#1 :如果你想改變輸出,那么你可以將兩個參數傳遞給closure
而不是一個參數,如下所示。 當然,您可能不想在您的框架中將相等性與靜態數字進行比較,因此第二個參數是有意義的。
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
,它不太可能被誤用於其他斷言,例如>
、 <
。
def assertEqual = { arg1, arg2 -> assert arg1 == arg2, "Comparison failed: ${arg1} vs ${arg2}" }
assertEqual(10, 20-11)
輸出:
java.lang.AssertionError:比較失敗:10 對 9。表達式:(arg1 == arg2)。 值:arg1 = 10,arg2 = 9
在 Script1$_run_closure1.doCall(Script1.groovy:1)
在 Script1.run(Script1.groovy:2)
您以這種方式編寫更多的閉包,例如assertGreaterThan
assertLessThan
用於特定操作。
方法#3 :在這里,您甚至可以將應該是錯誤消息的內容傳遞給閉包。
def assertEqual = { arg1, arg2, message -> assert arg1 == arg2, message(arg1, arg2) }
assertEqual(10, 20-11) {op1, op2 -> "$op1 is not equal to $op2"}
輸出:
java.lang.AssertionError: 10 is not equal to 9. Expression: (arg1 == arg2)。 值:arg1 = 10,arg2 = 9
在 Script1$_run_closure1.doCall(Script1.groovy:1)
在 Script1.run(Script1.groovy:2)
方法#4用戶可以傳遞operation
和消息的另一種變體。 您不僅可以執行equal
,還可以執行其他操作。 因此,將closure
名稱更改為myAssert
。
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" }
輸出:
java.lang.AssertionError: 10 不小於 9. 表達式: (op1 < op2)。 值:op1 = 10,op2 = 9
在 Script1$_run_closure2.doCall(Script1.groovy:2)
在 Script1$_run_closure1.doCall(Script1.groovy:1)
在 Script1.run(Script1.groovy:2)
如果您想采用簡單的方法並只使用equal
斷言,那么方法#2是正確的方法。 當然,您可以更好地選擇哪一種更適合您的需要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.