你已经看过了一些介绍GrailsUnitTestCase中mock…()方法的例子。
在这部分我们将详细地介绍所有GrailsUnitTestCase中提供的方法,首先以通用的mockFor()开始。
在开始之前,有一个很重要的说明先说一下,使用这些方法可以保证对所给的类做出的任何改变都不会让其他测试实例受影响。
这里有个普遍出现且严重的问题,当你尝试通过meta-class编程方法对它自身进行模拟,但是只要你对每个想模拟的类使用任何一个mock…()方法,这个问题就会消失了。mockFor(class, loose = false)
万能的mockFor方法允许你对你一个类设置strict或loose请求。
这个方法很容易使用,默认情况下它会创建一个strict模式的mock控制对象,它的方法调用顺序非常重要,你可以使用这个对象详细定义各种需求:def strictControl = mockFor(MyService)
strictControl.demand.someMethod(0..2) { String arg1, int arg2 -> … }
strictControl.demand.static.aStaticMethod {-> … }
注意你可以在demand后简单得使用static属性,就可以mock静态方法,然后定义你想mock的方法名字,一个可选的range范围作为它的参数。
这个范围决定这个方法会被调用了多少次,所以假如这个方法的执行次数超过了这个范围,偏小或偏大,一个诊断异常就会被抛出。
假如这个范围没有定义,默认的是使用“1…1”范围,比如上面定义的那个方法就只能被调用一次。
demand的最后一部分是closure,它代表了这个mock方法的实现部分。
closure的参数列表应该与被mock方法的数量和类型相匹配,但是同时你可以随意在closure主体里添加你想要的代码。
像之前提到的,假如你想生成一个你正在模拟类的能用mock实例,你就需要调用mockControl.createMock()。
事实上,你可以调用这个方法生成你想要的任何数量的mock实例。
一旦执行了test方法,你就可以调用 mockControl.verify()方法检查你想要执行的方法执行了没。
最后,如下这个调用:def looseControl = mockFor(MyService, true)
将生成一个含有loose特性的mock控制对象,比如方法调用的顺序不重要。