本文基于SpringBoot

在pom.xml添加Spock依赖

        <!-- test -->
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.</version>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency> <dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>1.1-groovy-2.4</version>
<scope>test</scope>
</dependency>

新建Sum.java

 public class Sum {
public int sum(int a, int b) {
return a + b;
}
}

新建groovy测试脚本SpockSpecification.groovy

 package com.test.bookup

 import com.example.demo.Sum
import spock.lang.Specification
import spock.lang.Unroll; /**
* Created by hande on 2018/7/18.
*/
class SpockSpecification extends Specification{ // 调用外部类测试
def sum = new Sum();
def "get sum"(){
expect:
sum.sum(,) ==
} // Where Blocks 简单大小比较函数测试
def "get max num"(){
expect:
Math.max(a,b) == c where:
a|b|c
||
||
||
} def "get min num"(){
expect:
Math.min(a,b) == c where:
a|b|c
||
||
||
} // 上述例子实际会跑三次测试,相当于在for循环中执行三次测试,如果在方法前声明@Unroll,则会当成三个方法运行。
@Unroll
def "@Unroll test"(){
expect:
Math.min(a,b) == c where:
a|b|c
||
||
||
} // where block另外两种数据定义方法
def "where block data init method"(){
expect:
Math.max(a,b) == c where:
a|_
|_
|_
|_ b<<[,,] c=a>b?a:b
} // When and Then Blocks
def "When and Then Blocks"(){
setup:
def stack = new Stack();
def em = "push me"; when:
stack.push(em); then:
!stack.empty();
stack.size() == ;
stack.peek() == em;
} // mock应用
Publisher publisher = new Publisher()
Subscriber subscriber = Mock()
Subscriber subscriber2 = Mock() def setup() {
publisher.subscribers.add(subscriber)
publisher.subscribers.add(subscriber2)
} def"should send messages to all subscribers"(){
when:
publisher.send("hello") then:
*subscriber.receive("hello")
*subscriber2.receive("hello")
}
// 上面的例子里验证了:在publisher调用send时,两个subscriber都应该被调用一次receive(“hello”)。
109 }

表达式中的次数、对象、函数和参数部分说明

 * subscriber.receive("hello")      // exactly one call
* subscriber.receive("hello") // zero calls
(..) * subscriber.receive("hello") // between one and three calls (inclusive)
(.._) * subscriber.receive("hello") // at least one call
(_..) * subscriber.receive("hello") // at most three calls
_ * subscriber.receive("hello") // any number of calls, including zero
* subscriber.receive("hello") // an argument that is equal to the String "hello"
* subscriber.receive(!"hello") // an argument that is unequal to the String "hello"
* subscriber.receive() // the empty argument list (would never match in our example)
* subscriber.receive(_) // any single argument (including null)
* subscriber.receive(*_) // any argument list (including the empty argument list)
* subscriber.receive(!null) // any non-null argument
* subscriber.receive(_ as String) // any non-null argument that is-a String
* subscriber.receive({ it.size() > }) // an argument that satisfies the given predicate
// (here: message length is greater than 3)
* subscriber._(*_) // any method on subscriber, with any argument list
* subscriber._ // shortcut for and preferred over the above
* _._ // any method call on any mock object
* _ // shortcut for and preferred over the above

Stubbing

对mock对象定义函数的返回值可以用如下方法:

subscriber.receive(_)>>"ok"

符号代表函数的返回值,执行上面的代码后,再调用subscriber.receice方法将返回ok。如果要每次调用返回不同结果,可以使用:

subscriber.receive(_) >>> ["ok", "error", "error", "ok"]

如果要做额外的操作,如抛出异常,可以使用:

subscriber.receive(_)>>{thrownewInternalError("ouch")}

而如果要每次调用都有不同的结果,可以把多次的返回连接起来:

subscriber.receive(_) >>> ["ok", "fail", "ok"] >> { throw new InternalError() } >> "ok"

mock and stubbing

如果既要判断某个mock对象的交互,又希望它返回值的话,可以结合mock和stub,可以这样:

then:
*subscriber.receive("message1")>>"ok"
*subscriber.receive("message2")>>"fail"

注意,spock不支持两次分别设定调用和返回值,如果把上例写成这样是错的:

setup:
subscriber.receive("message1")>>"ok" when:
publisher.send("message1") then:
*subscriber.receive("message1")

此时spock会对subscriber执行两次设定:

第一次设定receive(“message1”)只能调用一次,返回值为默认值(null)。
第二次设定receive(“message1”)会返回ok,不限制次数。

Spock集成入门的更多相关文章

  1. ①Jenkins集成—入门安装使用

    一.什么是Jenkins jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的"自动化"编译.打包.分发部署.jenkins可以很好的支持各 ...

  2. Jenkins持续集成 入门实践

    本文测试环境: ASP.NET MVC项目,Windows 7环境,SVN代码仓库, MSBuild,TortoiseSVN 持续集成这种工具很多了,Jenkins比较常用,他的原理就是一个服务,有一 ...

  3. ADF_Desktop Integration系列4_ADF桌面集成入门之部署ADF Desktop Excel

    2013-05-01 Created By BaoXinjian

  4. ADF_Desktop Integration系列3_ADF桌面集成入门之重定义ADF Desktop Excel

    2013-05-01 Created By BaoXinjian

  5. ADF_Desktop Integration系列2_ADF桌面集成入门之开发简单ADF Desktop Excel

    2013-05-01 Created By BaoXinjian

  6. ADF_Desktop Integration系列1_ADF桌面集成入门之设定Development Environment

    2013-05-01 Created By BaoXinjian

  7. 基于虹软人证核验 2.0 Android SDK开发集成入门

    一.功能介绍虹软人证核验 2.0 SDK(以下简称SDK)包含人脸检测.人脸跟踪.人证核验等能力,主要实现人证的1:1比对.其中暴露对外的功能方法有:active 引擎激活init 引擎初始化inpu ...

  8. 【ORM框架】Spring Data JPA(一)-- 入门

    本文参考:spring Data JPA入门   [原创]纯干货,Spring-data-jpa详解,全方位介绍  Spring Data JPA系列教程--入门 一.Spring Data JPA介 ...

  9. Web编译器Visual Studio扩展

    原文地址:https://marketplace.visualstudio.com/items?itemName=MadsKristensen.WebCompiler 一个Visual Studio扩 ...

随机推荐

  1. shell 全局剔除标点符号

    vim打开文件 []如果是单个字符的话,加上中括号就代表“或”了 :%s/[`~!@#$^&*()=|{}':;',\[\].<>?�/¥……——|[]‘::”“'.,.]//g ...

  2. zmap blacklist

    # From IANA IPv4 Special-Purpose Address Registry# http://www.iana.org/assignments/iana-ipv4-special ...

  3. ARKit从入门到精通(5)-ARScnView介绍

    转载:http://blog.csdn.net/u013263917/article/details/73156918 AR视图,在第一小节笔者介绍过,ARKit支持3D的AR场景和2D的AR场景,A ...

  4. Android 收集已发布程序的崩溃信息

    我们写程序的时候都希望能写出一个没有任何Bug的程序,期望在任何情况下都不会发生程序崩溃.不过理想是丰满的,现实是骨感的.没有一个程序员能保证自己写的程序绝对不会出现异常崩溃.特别是针对用户数达到几十 ...

  5. Oracle 报错:PLS-00201: 必须声明标识符

    原因:调用其他用户的包或存储过程. 解决方法:在被调用的包或存储过程的用户下授权执行权限给调用用户: grant execute on 包名 to 用户名;

  6. PHP判断当前页面是电脑登录,还是手机登录

    //判断是否是电脑登录,还是手机登录 public function isMobil() { $useragent = isset($_SERVER['HTTP_USER_AGENT']) ? $_S ...

  7. 《5天学会卡西欧fx-5800p之实操视频教程(初级)》目录和我的工作室现场曝光

    很多人给我讲,想让我录制一份卡西欧fx-5800p的视频教程,我也一直在准备,准备了半年,录制视频真的不是件容易的事,条件有限,而且工作也很忙,中途还会有想放弃的念头,真的是花费了我很多的心血,但不管 ...

  8. opencv中图像伪彩色处理(C++ / Python)

    使用OpenCV的预定义的颜色映射来将灰度图像伪彩色化. 1. colormap(色度图)是什么? 假设我们想在地图上显示美国不同地区的温度.我们可以把美国地图上的温度数据叠加为灰度图像——较暗的区域 ...

  9. [开发笔记]-Linq to xml学习笔记

    最近需要用到操作xml文档的方法,学习了一下linq to xml,特此记录. 测试代码: class Program { //参考: LINQ to XML 编程基础 - luckdv - 博客园 ...

  10. SQLServer当数据导入平面文件

    SQLServer当数据导入无发正常工作时候,可以尝试BULK命令操作 BULK INSERT [dbo].[test] FROM 'H:\testdb.csv' WITH( FIELDTERMINA ...