Unit testing 使用mockFor和MockDomain发出覆盖方法
我正在尝试对一个服务进行单元测试,我想使用一个mock来覆盖域对象上的一个方法,该对象从数据库中检索文件Unit testing 使用mockFor和MockDomain发出覆盖方法,unit-testing,grails,Unit Testing,Grails,我正在尝试对一个服务进行单元测试,我想使用一个mock来覆盖域对象上的一个方法,该对象从数据库中检索文件 def mockElem = mockFor(DataElement, false) mockElem.demand.getFile(){return tempFile} def dataElem = mockElem.createMock() dataElem.orderId = "123" dataElem.id = tempFileName
def mockElem = mockFor(DataElement, false)
mockElem.demand.getFile(){return tempFile}
def dataElem = mockElem.createMock()
dataElem.orderId = "123"
dataElem.id = tempFileName
dataElem.dataType = "cnv"
dataElem.dataStatus = DataStatus.TRANSFERED
mockDomain(DataElement, [dataElem])
当我调用数据元素上的动态查找程序时,我希望这个模拟域与getFile的mockFor demand功能一起返回。到达MockDomain行时引发断言错误
junit.framework.AssertionFailedError:不需要调用“getClass”
在这一点上。仍需要1个对“getFile”的调用。在
groovy.mock.interceptor.StreetExpection.match(StreetExpection.groovy:56)
位于grails.test.GrailsMock.createMock_closure1(GrailsMock.groovy:136)
在
grails.test.MockUtils.updateMetaClassForClass_closure95(MockUtils.groovy:1297)
在groovy.lang.Closure.call(Closure.java:412)中
调用(Closure.java:425)
grails.test.MockUtils.updateMetaClassForClass(MockUtils.groovy:1294)
位于grails.test.MockUtils.mockDomain(MockUtils.groovy:470)
grails.plugin.spock.UnitSpec.mockDomain(UnitSpec.groovy:141)位于
com.genospace.inbound.pg.HemeCNVPipelineTestSpec.test加工血红素
文件(HemeCNVPipelineTestSpec.groovy:66)
不知道问题是什么 出现此错误是因为模拟对象两次:
- 使用
/mockFor
createMock
- 使用
mockDomain
mockDomain
需要知道一些关于作为参数传递的对象的信息(这里它验证类是否正确),但是mockFor
不允许调用getClass()
:您没有为此类调用添加demand
你真的需要用需求
来模拟吗
我认为简单的案例应该有效:
def dataElem = new DataElement()
dataElem.orderId = "123"
dataElem.id = tempFileName
dataElem.dataType = "cnv"
dataElem.dataStatus = DataStatus.TRANSFERED
dataElem.file = tempFile
mockDomain(DataElement, [dataElem])
为了测试的目的,我想覆盖域对象上getFile的功能。简单地设置文件无法实现这一点。因此,我想您必须通过
元类来覆盖getFile()
方法,而不是mockFor
。请看:是的,这就是我目前解决这个问题的方式,但我被告知这会改变JVM范围内的类定义,因此如果其他类会受到影响。我希望可以使用MockForYou在setUp
中隔离更改,并在tearDown
中恢复原始值