用Closure来作为测试Mock

 

使用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 }
还是非常简单。
 
 
 
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值