我正在类似于以下给出的服务类中为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/