Unit testing 使用mockFor和MockDomain发出覆盖方法

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

我正在尝试对一个服务进行单元测试,我想使用一个mock来覆盖域对象上的一个方法,该对象从数据库中检索文件

    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
中恢复原始值