0、前置知识(写完最后一节,再补上这节吧)
- mock,参考mockito相关资料
- 使用环境的搭建,maven + groovy + spock + spock spring
- groovy:《groovy编程》《groovy cookbook》《groovy for domain specific languages》
- 深入理解:《antlr4权威指南》,groovy解析器是用antlr写的,该书作者Terence Parr还有一本讲编译原理实战的书籍,崇拜下,真正的高手就是能用简单的语言讲复杂的东西。
- 这也说明,当你看不懂书的时候,不是你不够聪明,而是书写得不行。
1、mock使用注意事项
mock必须在verify的时候指定返回值,如果使用和stub相同的语法,将导致then里的verify失效。mock是stub的超集。
given: 'a mock'
def m = Mock(Demo)
// m.f() >> 1 将导致后面的1 * m.f()失效
and: 'a service using the mock'
def service = new ServiceImpl()
service.m = m // inject
when: 'service use the mock'
service.doWork() // call m.f()
then: 'verify m.f is called once with return value 1'
1 * m.f() >> 1 // 正确的做法:在此处指定返回值
2、data table的使用
一般而言,有如下的例子:
class Adder {
def sum(int a, int b) {
return a+b
}
}
// test code
given: 'an adder with sum method'
def a = new Adder()
when: 'sum is done with given a and b in data table'
def result = a.add(v1, v2)
then: 'result should be v1 + v2'
result == v1 + v2
where: 'v1, v2, result are given below'
v1 | v2 || result
1 2 3
2 3 5
但是,实际情况可能更加复杂,输入可能并不是简单的数字,比如,需要输入一些对象,该怎么办呢?可以使用表达式,调用工厂方法生成对象。也可以使用闭包创建对象,但是在where块里调用闭包会产生RuntimeException,这时可以使用折中的方法,如:
...
given:
... // dup code is left out
and: 'a data generator'
def gen = {it}
then: 'result should be v1 + v2'
result == gen(g1) + gen(g2)
where: 'v1, v2, result are given below'
g1 | g2 || result
1 2 3
2 3 5
// 下面的代码将报错:找不到符号gen
// v1 |v2 ||result
// gen(1) gen(2) 3
3、集成测试
- @Stepwise注解:保证测试按照声明的顺序执行,这很关键,我们可以按照造数据 - 使用 - 清除的过程来避免污染测试环境的数据,减少多余的数据准备代码,从而降低代码复杂度。
- @Timeout注解:限定测试执行的时间。
- @Ignore,@IgonoreRest,@IgnoreIf
- @AutoCleanup注解:执行指定的清理方法。
- 使用given-expect-when-then中的expect做setup结果的校验
- 使用with block做对象属性的校验(可用lombok生成的equals方法判断相等)
4、maven集成groovy
最清楚的配置(从书里粘贴而来)。
<plugin>
<groupId>org.codehaus.gmavenplus</groupId>
<artifactId>gmavenplus-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
4、组织问题
最关键的问题是,这么好用,如何说服同事使用这套东西?
不得不说,很难。
人一般很固执,接受新东西?不可能。
你和我不一样?对不起,你是错的。
学个python?大家都用,简单,高大上,学!
spock?我去,java + groovy + 海量jar + spock语法,closure是啥?
毫不夸张得说,50%的人无法区分单元测试和集成测试。。
最终结果:我是谁?这是哪?再见!