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

Groovy 是否可以临时用另一个类替换一个类?,groovy,Groovy,我正在为一个方法编写一个单元测试,该方法从Patient类的实例中获取各种信息。Patient类是一个非常复杂的容器,它包含了一堆其他东西,可以通过执行Patient.demographics.firstName之类的操作轻松获取信息。如果不将我的单元测试转换为集成测试,就不可能创建一个“真正的”患者 显而易见的解决办法是用Map替换Patient。如果这是Python,我就可以做Patient=dict,继续我的生活,但我在Groovy==中找不到任何等价物,我能找到的只是替换方法。从在Gro

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

显而易见的解决办法是用
Map
替换
Patient
。如果这是Python,我就可以做
Patient=dict
,继续我的生活,但我在Groovy==中找不到任何等价物,我能找到的只是替换方法。从在Groovy中测试的信息最少,我似乎可以使用地图强制作为一个过于复杂的替代品,但我认为这是最后的手段。 所讨论的代码是
Patient lpatient=app.createLegacyPatient(payload.patientId.toLong())
,我已经模拟了createLegacyPatient方法以返回映射。问题是,地图对象不是患者对象,尝试将其投射到患者身上是行不通的

在Groovy中是否有任何方式可以说“这个类现在就是另一个类,直到我说不一样?”换句话说,是否有可能执行某种操作,使
new Patient()
实际返回
Map
对象?

Groovy附带了一个类,我认为它可以满足您的需要。下面是一个例子:

def patient = new Expando()

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

assert patient.demographics.firstName == "John"
您还可以使用
映射初始化
Expando

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

def patient = new Expando(map)

assert patient.demographics.firstName == "John"
在许多情况下,仅使用
映射就足够了:

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

assert patient.demographics.firstName == "John"

是的,映射强制是Groovy中模拟对象的首选方式

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

assert patient.demographics.lastName == "lennon"

就这些。您刚刚使用Python中使用的映射创建了一个Patient对象,我想我的问题还不清楚。我已经更新了。我试图传递一个Expando,但遇到了同样的问题。这取决于Groovy是否可以创建代理,但代理并不总是被“欺骗”的代码所接受。请使用
患者
发布一个代码示例,对于该患者,
地图
是不够的。我真的不能发布比我更多的代码(这是为了工作),但问题的答案似乎非常清楚地是“不”,我最终通过将
患者lpatient
更改为
def lpatient
来避免这个问题。我本来不太愿意这么做,因为那是我作为承包商的公司的一名全职员工编写的代码,但是。。。静态打字很糟糕。