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
来避免这个问题。我本来不太愿意这么做,因为那是我作为承包商的公司的一名全职员工编写的代码,但是。。。静态打字很糟糕。