Spock集成入门
本文基于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集成入门的更多相关文章
- ①Jenkins集成—入门安装使用
一.什么是Jenkins jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的"自动化"编译.打包.分发部署.jenkins可以很好的支持各 ...
- Jenkins持续集成 入门实践
本文测试环境: ASP.NET MVC项目,Windows 7环境,SVN代码仓库, MSBuild,TortoiseSVN 持续集成这种工具很多了,Jenkins比较常用,他的原理就是一个服务,有一 ...
- ADF_Desktop Integration系列4_ADF桌面集成入门之部署ADF Desktop Excel
2013-05-01 Created By BaoXinjian
- ADF_Desktop Integration系列3_ADF桌面集成入门之重定义ADF Desktop Excel
2013-05-01 Created By BaoXinjian
- ADF_Desktop Integration系列2_ADF桌面集成入门之开发简单ADF Desktop Excel
2013-05-01 Created By BaoXinjian
- ADF_Desktop Integration系列1_ADF桌面集成入门之设定Development Environment
2013-05-01 Created By BaoXinjian
- 基于虹软人证核验 2.0 Android SDK开发集成入门
一.功能介绍虹软人证核验 2.0 SDK(以下简称SDK)包含人脸检测.人脸跟踪.人证核验等能力,主要实现人证的1:1比对.其中暴露对外的功能方法有:active 引擎激活init 引擎初始化inpu ...
- 【ORM框架】Spring Data JPA(一)-- 入门
本文参考:spring Data JPA入门 [原创]纯干货,Spring-data-jpa详解,全方位介绍 Spring Data JPA系列教程--入门 一.Spring Data JPA介 ...
- Web编译器Visual Studio扩展
原文地址:https://marketplace.visualstudio.com/items?itemName=MadsKristensen.WebCompiler 一个Visual Studio扩 ...
随机推荐
- QT-提示“database not open”
问题现象: 要用QT开发"SQLite"时出现如下提示: QSqlQuery::exec: database not open QSqlDatabase: QSQLITE driv ...
- C#学习笔记(6)——大项目增删改查
说明(2017-5-28 11:35:39): 1. 需要注意的地方很多 2. 首先是连接字符串str要直接写在类里面,不然每个按钮里面都要写一遍. 3. 查询用到sqlDataReader等三个方法 ...
- Nosql相关产品和分布式相关中间件
1.memcached 2.redis 3.mongodb 4.消息队列的运用
- [转]Oracle 语法之 OVER (PARTITION BY ..) 及开窗函数
oracle的分析函数over 及开窗函数 一:分析函数Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是 对于每个组返回多行,而聚合函数对于每个组 ...
- C++实现的服务不可用发送报警邮件
正在看C++,我主业是Java开发,但是最近服务不太稳定,自己用C++造了个小轮子. 配置好要监控的访问路径,IP.端口号和路径.涉及到的知识点有以下几个部分: 构造函数与析构函数 内存的分配与释放( ...
- C语言 · Quadratic Equation
算法提高 Quadratic Equation 时间限制:1.0s 内存限制:512.0MB 问题描述 求解方程ax2+bx+c=0的根.要求a, b, c由用户输入,并且可以为任意 ...
- 新浪微博 oauth2.0 redirect_uri_mismatch
新浪微博开放平台出来很久了,现在才开始研究,貌似有点晚了.... 第一次折腾,总是出现这样那样的问题,即使照着别人成功的例子也是一样,这不,开始运行的时候,运行下面的例子,总是报error:redir ...
- java 集合排序
Java API针对集合类型排序提供了两种支持:java.util.Collections.sort(java.util.List)java.util.Collections.sort(java.ut ...
- Java编程的逻辑 (46) - 剖析PriorityQueue
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- MongoDB 比较适用哪些业务场景?
在云栖社区上发起了一个 MongoDB 使用场景及运维管理问题交流探讨的技术话题,有近5000人关注了该话题讨论,这里就 MongoDB 的使用场景做个简单的总结,谈谈什么场景该用 MongoDB ...