是否可以暂时用另一个类替换一个类?

时间:2017-01-09 21:32:01

标签: groovy

我正在为一个方法编写单元测试,该方法从Patient类的实例中获取各种信息。 Patient类是一个非常复杂的容器,围绕着许多其他东西,这使得通过patient.demographics.firstName之类的操作可以轻松获取信息。如果不将我的单元测试转换为集成测试,就不可能创建一个“真正的”患者。

显而易见的解决方案是将Patient替换为Map。如果这是Python,我可以做Patient = dict并继续我的生活,但我无法在Groovy中找到任何等效的东西==我所能找到的只是替换方法。从Groovy中有关测试的极少信息来看,似乎我可以使用地图强制作为过于复杂的替代品,但我认为这是最后的手段。

有问题的代码是Patient lpatient = app.createLegacyPatient(payload.patientId.toLong()),我已经模拟了createLegacyPatient方法来返回地图。问题是,Map对象不是Patient对象并且试图将其强制转换为Patient不起作用。

Groovy有没有办法说“这个课程现在是另一个课程,直到我说出不同的内容?”换句话说,是否可以执行某些操作以使new Patient()实际返回Map个对象?

2 个答案:

答案 0 :(得分:1)

Groovy附带一个Expando课程,我认为这个课程符合您的需求。这是一个例子:

def patient = new Expando()

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

assert patient.demographics.firstName == "John"

您还可以使用Expando初始化Map

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"

答案 1 :(得分:0)

是的,地图强制是Groovy模拟对象的首选方式

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

assert patient.demographics.lastName == "lennon"

这就是全部。您刚刚使用Map在Python中创建了一个Patient对象