2017-01-09 65 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

相关问题