使用Groovy提供的Closure可以非常方便地实现测试Mock .
见下面示例:
首先定义几个接口:
interface Logger { def log(message) }
interface Helper { def doSomething(param) }
interface Factory { Helper getInstance() }
测试的目标是下面这个MyApp:
class MyApp {
private factory
private logger
MyApp(Factory factory, Logger logger) {
this.logger = logger
this.factory = factory
}
def doMyLogic(param) {
factory.getInstance().doSomething(param)
logger.log('Something done with: ' + param)
}
}
为了测试这个类,典型的做法是构建几个Mock实现,然后编写测试脚本,来进行测试。
下面使用Closure来实现Mock,看看效果如何:
def param = 'DUMMY STRING'
def logger = { message -> assert message == 'Something done with: ' + param}
def helper = { assert it == param }
def factory = { helper as Helper }
测试脚本:
def myApp = new MyApp(factory as Factory, logger as Logger)
myApp.doMyLogic(param)
可以看到用Closure实现Mock是多么方便,充分地利用了Groovy的智能匹配策略,基本不用显示地来定义接口实现类。
上面这个例子可能过于简单了些,如果一个接口包含多个方法,好像就没有这么简单了 。
例如,如果Helper接口象下面这样:
interface Helper {
def doSomething(param)
def doSomethingElse(param)
}
而待测试逻辑这两个方法都用到了,如下:
def doMyLogic(param) { def helper = factory.getInstance() helper.doSomething(param) helper.doSomethingElse(param) logger.log('Something done with: ' + param) }
那么,Helper的Mock可以这么定义:
def helperMethod = { assert it == param } def helper = [doSomething:helperMethod, doSomethingElse:helperMethod] // as before def factory = { helper as Helper }
还是非常简单。