我正在类似于以下给出的服务类中为methodA()编写测试。

Class SampleService {
  def methodA(){
     methodB()
  }

  def methodB(){
  }
}

当我测试methodA()时,我需要能够在测试methodA()时模拟对methodB()的调用。我正在使用grails的2.0.x版本。在1.3.x发行版中,我将编写一个这样的自我模拟
def sampleServiceMock = mockFor(SampleService)
sampleServiceMock.demand.methodB { -> }

但这在2.0.x版本中不起作用。我想知道在测试methodA()时模拟methodB()的其他方法是什么

最佳答案

对于此类问题,我实际上避免了模拟,并使用内置的groovyProxy功能将闭包映射转换为代理对象。这为您提供了一个实例,其中某些方法被覆盖,但其他方法则传递给了真实的类:

class SampleService {
    def methodA() {
        methodB()
    }

    def methodB() {
        return "real method"
    }
}

def mock = [methodB: {-> return "mock!" }] as SampleService

assert "mock!" == mock.methodA()
assert "real method" == new SampleService().methodA()

我喜欢只更改一个实例,可以在一行中完成,并且不会与该实例之外需要清除的任何内容的元类混淆。

关于testing - Grails:我如何模拟被测类的其他方法,这些方法可能在测试期间在内部被调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10203856/

10-11 21:40