Grails:我如何模拟测试中可能在内部调用的类的其他方法

时间:2012-04-18 06:19:03

标签: testing grails groovy mocking tdd

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

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

  def methodB(){
  }
}

当我测试methodA()时,我需要能够在测试methodA()时模拟对methodB()的调用。我使用的是版本2.0.x的grails。在1.3.x发行版中,我会写一个像这样的自我模拟

def sampleServiceMock = mockFor(SampleService) 
sampleServiceMock.demand.methodB { -> } 

但这在2.0.x版本中不起作用。我想知道在测试methodA()

时模拟methodB()的其他方法是什么

2 个答案:

答案 0 :(得分:36)

对于这种问题,我实际上避免了模拟,并使用内置的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()

我喜欢它只更改一个实例,可以在一行中完成,并且不会弄乱那个需要清理的实例之外的任何元类。

答案 1 :(得分:12)

Groovy有许多嘲弄的替代品。您可以看到Groovy Mocksusing Maps and Expandos instead of Mocksusing Closures instead of Mocks的一些文档。

在您的示例中,我将使用Groovy的元编程功能。

void testMethodA() {
    service = new SampleService()
    service.metaClass.methodB = { -> return "what you want" }
    service.methodA()
    assert "your condition"
}