2017-10-14 101 views
0

Groovy的新手,並試圖讓我的頭部將通用代碼提取到整潔的方法中。抽象爲一種常用的方法

我怎麼會寫一個Groovy方法可以被稱爲作出的斷言,並可能在這兩個非常類似的例子可以使用:

boolean foundName = groups.any({ [email protected]'name' == expectedResult.name.toString()}) 
Assert.assertTrue(foundName, "name: ${expectedResult.name.toString()}") 

... ... 

boolean foundDisc = groups.any({ [email protected]'disc' == expectedResult.disc.toString()}) 
Assert.assertTrue(foundDisc, "disc: ${expectedResult.disc.toString()}") 

我打破了成兩行,以顯示我的意圖。傳遞期望值非常簡單,但我如何通過另一個呢?一些沿着這些線具有簽名的東西:

void assertAnyAttributeEquals(??? it ???, String attributeName, String expectedResult) 
+1

你的榜樣斷言'foundNumber',但我認爲應該是'foundDisc'。 –

回答

2

這裏有用的技術是使用字符串插值作爲屬性/字段說明符。例如:

def myAssert = { groups, attr, expectedResult -> 
    def found = groups.any({ [email protected]"${attr}" == expectedResult."${attr}".toString() }) 
    assert found 
} 

下面是一個完整,工作示例:

class Result { 
    def name 
    def disc 
} 

def xmlStr = ''' 
<doc> 
    <groups name="hello" /> 
    <groups disc="abc" /> 
</doc> 
''' 

def myAssert = { groups, attr, expectedResult -> 
    def found = groups.any({ [email protected]"${attr}" == expectedResult."${attr}".toString() }) 
    assert found 
} 

def xml = new XmlSlurper().parseText(xmlStr) 

myAssert(xml.groups, 'name', new Result('name': 'hello')) 
myAssert(xml.groups, 'disc', new Result('disc': 'abc'))