我正在为一个方法编写单元测试,该方法从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
个对象?
答案 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对象