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扩 ...
随机推荐
- signal函数的原型声明void (*signal(int signo, void (*fun(int))))(int)分析
转:http://blog.sina.com.cn/s/blog_4850a7880100hnam.html void (*signal(int signo, void (*fun(int))))(i ...
- LeetCode: Search in Rotated Sorted Array 解题报告
Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...
- Python nose单元测试框架的安装与使用
[本文出自天外归云的博客园] 安装(Python2下安装) pip install nose 原理与命名规则 Nose会自动查找源文件.目录或者包中的测试用例,符合正则表达式(?:^|[\b_\.%s ...
- win7下memCache安装过程
1.下载memcache 的windows 稳定版,解压放某个盘下面,比如在H:/wamp/www/php api/memcache: 2.在终端(即cmd 命令界面)下,输入安装命令 :H:/wam ...
- vagrant中css,img不生效的问题
用vagrant搭建了一个共享开发平台,修改css文件后,页面看不到效果,通过查看源文件地址,发现新修改的Css文件并没有加载进来,加载的还是旧的文件地址.一开始以为是浏览器有缓存,清空了各种浏览器缓 ...
- open source Swift, Objective-C and the next 20 years of development
Q&AApple's Craig Federighi talks open source Swift, Objective-C and the next 20 years of develop ...
- UIButton的竖排图片和文本
UIButton的竖排图片和文本html, body {overflow-x: initial !important;}.CodeMirror { height: auto; } .CodeMirro ...
- C# 中的await
今天看代码遇到了很多await,梳理一下await的用法. await只针对awaitable对象,经常和Task一起使用,主要用法如下: var task = RunAsync(); //开始执行异 ...
- java读取配置文件内容
利用com.typesafe.config包实现 <dependency> <groupId>com.typesafe</groupId> <artifact ...
- 【Android开源项目分析】自定义圆形头像CircleImageView的使用和源码分析
原文地址: http://blog.csdn.net/zhoubin1992/article/details/47258639 效果