本文基于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. LOCAL_EXPORT_C_INCLUDES和LOCALC_INCLUDES 的差别

    http://stackoverflow.com/questions/6595208/what-does-this-line-mean-local-export-c-includes LOCAL_EX ...

  2. Java运行时动态加载类之ClassLoader

    https://blog.csdn.net/fjssharpsword/article/details/64922083 *************************************** ...

  3. MSTP故障处理手册

    H3C核心交换机常见故障定位手册.pdf MSTP故障处理手册.pdf 目 录 1 MSTP故障处理 1.1 广播风暴故障处理 1.1.1 故障描述 1.1.2 故障处理流程 1.1.3 故障处理步骤 ...

  4. Android开发(三)——Android布局中实现圆角边框

    设置corners_bg.xml(设置边框圆角可以在drawable-mdpi目录里定义一个xml): <?xml version="1.0" encoding=" ...

  5. 3. 文本相似度计算-DSSM算法

    1. 文本相似度计算-文本向量化 2. 文本相似度计算-距离的度量 3. 文本相似度计算-DSSM算法 4. 文本相似度计算-CNN-DSSM算法 1. 前言 最近在学习文本相似度的计算,前面两篇文章 ...

  6. iOS微信实现第三方登录的方法

    这篇文章主要介绍了iOS微信第三方登录实现的全过程,一步一步告诉大家iOS微信实现第三方登录的方法,感兴趣的小伙伴们可以参考一下   一.接入微信第三方登录准备工作.移动应用微信登录是基于OAuth2 ...

  7. Spirng MVC启动流程

    以Tomcat为例,想在Web容器中使用Spirng MVC,必须进行四项的配置: 修改web.xml,添加servlet定义.编写servletname-servlet.xml( servletna ...

  8. python -修改文件中某一行

    写代码写错了顺序,所以想办法把x,y坐标调换回来 def change_ptsxy(fileName): fp = open(fileName) i = file_data = "" ...

  9. java IO【转】

    Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java 内用 U ...

  10. ie6 无法显示网页 已终止操作

    已终止操作原因: 在文件加载完成之前执行了dom操作,如appendChild, innerHTML等 解决办法: ready后再执行