《Java Testing with Spock》读书笔记

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.gmavenplusgroupId>
  <artifactId>gmavenplus-pluginartifactId>
  <version>1.4version>
  <executions>
    <execution>
      <goals>
        <goal>compilegoal>
        <goal>testCompilegoal>
      goals>
    execution>
  executions>
plugin>

4、组织问题

最关键的问题是,这么好用,如何说服同事使用这套东西?

不得不说,很难。

人一般很固执,接受新东西?不可能。

你和我不一样?对不起,你是错的。

学个python?大家都用,简单,高大上,学!

spock?我去,java + groovy + 海量jar + spock语法,closure是啥?

毫不夸张得说,50%的人无法区分单元测试和集成测试。。

最终结果:我是谁?这是哪?再见!

你可能感兴趣的:(groovy应用)