1、Spock是什么?java
2、Spock+Groovy让咱们的测试代码更轻框架
3、spock的与其余框架的对比函数
一、Spock强制使用一套清晰的测试结构单元测试
使用Spock缘由是会让你感受层级分明,相对于其余框架来讲代码具备更高的可读性,而JUnit测试缺少正式的语义,在JUnit测试中,arrange-act-assert模式是隐含的很容易被忽略,例如一名java开发人员可将JUnit测试写成以下:测试
当arrange-act-assert模式结构被破坏了,代码可阅读性变差,当内容较长,逻辑复杂,这时单测的维护成本就变的很大,而Spock除了使用基本的given-when-then,还可使用其余的代码块来保证测试的结构完整性。rest
开发维护人员仅仅经过阅读对应的代码块的名字便可知道这个测试是作什么的,清晰明了。对象
二、参数化测试blog
JUnit和Mockito对于参数化的支持很是有限并且很受限制,JUnit测试很显然不符合DRY原则(Don't repeat yourself,不要重复本身),有太多的相同代码, 而Spock提供数据表格正好能解决这个问题, spock能以直观的方式编写参数化,并且代码不须要重复,将数据和描述以表格的形式放在一块儿。经过以上代码能够看到,这里讲三个JUnit的测试合并在一个单独的spock测试里,不须要写重复代码, 测试逻辑只要写一次,全部的输入和输出都集中在一个地方,可阅读性高,参数名称在表格头部清晰可见。资源
三、开箱即用开发
Groovy自动提供一个构造函数,构造函数接受一个名称-值对与类的属性相对应,是Groovy开箱即用的功能— 用于类中定义的任何属性,Groovy 容许将存储了大量值的映射传给构造函数,不用初始化对象的每一个属性,减轻代码。
新建一个类song:
可添加下面这个代码:
在JUnit只能一个个的set值,比较繁琐。
四、关于重载
在实际开发项目中,少不了用重载,在JUnit中测试重载须要写大量的重复代码,很是繁琐复杂,而在Spock中使用*匹配器,如上用restTemplate.exchange(*),便可测试全部的重载方法,简洁优雅。
五、断言异常
Spock还为咱们提供了一种表达方式来检查异常状况。在JUnit中,咱们的一些选项可能会使用try-catch块,在咱们测试的顶部声明,或者使用第三方库。 Spock的原生断言提供了一种处理exception状况的方法:
在这里,咱们不须要引入额外的库。另外一个优势是thrown()方法将断言异常的类型,但不会暂停执行测试。
六、mock和stubbing
经过使用mock和stub,可让mock对象进行交互,得到指望的返回值,这在JUnit和mockito中是很难实现的,而在Spock仅用几行代码就能够优雅实现了。