如图,有如上的方法调用关系(模块依赖关系):A调用B和E方法,B调用C和D方法。
在使用spock进行单元测试时,有如下情景,分别可使用stub和mock。
如果我们需要测试A方法,但是E方法目前还没办法调用,或者还没开发完成。这种场景下,就可以使用stub测试桩。stub测试桩可以给E方法模拟一个或多个假的返回值,我们测试时只需要调用stub对象的E方法即可,调用后的返回值是我们在生成stub对象时指定的。如下:
上面代码中,calculateService.plusPlus(_) >> 1
给一个并未实现的plusPlus()方法指定了返回值为1,测试代码就可以直接调用这个方法了。
其中这个语句的常用格式有:
这种方式,生成返回值的格式时一个闭包
上面代码中,方法被调用的前三次分别返回 “ok”, “fail”, “ok”,第四次会抛出异常,第五次及以后调用,会返回“ok”。
以上是spock中stub测试桩的使用场景,总结为一句就是: stub测试桩给被调用者( 方法/模块)制造假的返回值,以便不影响调用者的测试。
mock测试桩就是模拟一个测试的结果。如下图,A类调用类B和C类的某个方法:
如果要测试A的方法,但是我们没办法调用B来检测结果,就可以使用mock测试桩,生成一个B的mock对象。检验结果时,可以使用B的mock对象替代B。这个结果一般是B和C方法的调用或者状态的改变。
对于mock对象的断言请参考: http://jvm123.com/2019/09/spock-ce-shi-zhuang-2.html
以上是spock中mock测试桩的使用场景,总结为一句就是: mock测试桩给被测试方法模拟一个预期的效果。
mock测试桩用于检测结果。
stub测试桩用于提供测试的条件。
本文来自java技术分享站(jvm123.com)http://jvm123.com/2019/09/spock-ce-shi-zhuang-3.html