2017-01-09 85 views
1

我正在爲從Patient類的實例獲取各種信息的方法編寫單元測試。 Patient類是一個非常複雜的容器,可以通過執行諸如patient.demographics.firstName之類的操作來輕鬆獲取信息。如果不將單元測試轉變爲集成測試,就無法創建「真實」病人。是否有可能暫時用另一個類替換一個類?

明顯的解決辦法是用Map替換Patient。如果這是Python,我可以做Patient = dict並繼續我的生活,但我還沒有能夠在Groovy中找到任何等價物==我只能找到替代方法。從Groovy測試中最基本的信息來看,似乎我可以使用map強制作爲一個過於複雜的替代品,但我認爲這是最後的手段。

有問題的代碼是Patient lpatient = app.createLegacyPatient(payload.patientId.toLong()),我已經嘲笑createLegacyPatient方法返回地圖。問題是,一個Map對象不是一個Patient對象,並試圖將其轉換爲Patient不起作用。

Groovy有什麼方法可以說:「這個班現在是另一班,直到我說不同嗎?」換句話說,是否有可能做到這樣new Patient()實際上會返回一個Map對象?

+0

這真的取決於因爲Groovy可以創建一個代理,但代理並不總是由代碼被「騙」接受。請發佈一個代碼示例,使用'Patient',其中'Map'不足。 –

+0

我真的發不了比我更多的東西(這是爲了工作),但似乎這個問題的答案顯然是「不」。對於它的價值,我最終通過將「病人病人」改爲「病人病人」來避免這個問題。我最初並不願意這樣做,因爲那是一個由我是承包商的公司的正式員工編寫的代碼,但是,嗯......靜態打字很爛。 – khagler

回答

1

Groovy附帶Expando類,我認爲這將適合您的需求。這裏有一個例子:

def patient = new Expando() 

patient.demographics = [ firstName : "John", lastName : "Galt" ] 

assert patient.demographics.firstName == "John" 

您也可以初始化ExpandoMap

def map = [ 
    demographics : [ 
     firstName : "John", lastName : "Galt" 
    ] 
] 

def patient = new Expando(map) 

assert patient.demographics.firstName == "John" 

在許多情況下,只使用一個Map就足夠了:

def patient = [ 
    demographics : [ 
     firstName : "John", lastName : "Galt" 
    ] 
] 

assert patient.demographics.firstName == "John" 
+0

我想我的問題還不清楚。我已經更新了它。我嘗試傳遞一個Expando,但遇到了同樣的問題。 – khagler

0

是,地圖脅迫是Groovy嘲笑對象的首選方式

def patient = [ 
    demographics : [ 
     firstName : "John", lastName : "lennon" 
    ] 
] as Patient 

assert patient.demographics.lastName == "lennon" 

就是這樣。您剛剛創建使用地圖就像您使用的患者對象在Python

相關問題