1

前面的几篇文章介绍了Spock的各种语法,和power mock的结合,以及注意事项,这篇做个总结,让大家对Spock有个全面客观的了解

Spock优点

  • 遵循BDD模式、功能强大、语义规范、可读性好、易于维护、富有表现力
  • 更灵活的控制测试行为,专注代码的逻辑测试而不是书写语法上
  • 用自然语言描述测试步骤(非技术人员也能看懂测试用例)
  • 兼容mock框架,可以和项目中的java单测代码共存,降低迁移成本
  • IDE支持良好
  • Groovy动态语言,DSL,语法简洁,约定优于配置,适合敏捷开发

Spock缺点

1. 学习成本

Spock本身其实没什么学习成本,因为它的限制条件不多:必须有至少一个标签、有when必有then

主要是groovy语言,如果用过的会觉得很容易(其实真的很容易),没用过的也不用担心,因为只要你会java,就会groovy,花个半小时在网上看下它的基本语法即可,因为我们只是用来写单元测试

groovy还有一个特点就是你可以在Spock的单测代码里完全用java代码写,因为groovy完全兼容java语法,或者java和groovy混着写都没问题,因为最终都是编译成class执行的,JVM虚拟机不关心源文件是什么语言

(其实groovy的用途很广,像我们的Jenkins里的pipeline、Elasticsearch、hadoop框架中很多插件都是使用groovy开发的)

2. 单测代码执行时间

groovy语法的简洁可以简单理解为语法糖(其实不完全是,在jvm中执行使用的是invokeDynamic指令),语法糖会相应的增加jvm构建AST语法树的时间

大家在运行的时候可能会注意到spock代码的编译要比java的单测代码慢一些(视代码复杂度而言,平均大概慢1-2s),但是执行的时间和java的差不多,如果对这个有要求,慎重使用,最好自己本地验证下

3. Spock不支持静态、Final方法的Mock

关于这一点在前面的文章里已经讲过,所以需要引入power mock,也没必要重复造轮子

另外在Spock代码里不能使用power mock的注解,比如@InjectMock,Spock有一些兼容问题,可以使用PowerMockito.mock()的方式代替注解,但可能没有注解的语法简洁

总体上利大于弊

有时候你觉得单测代码很难写,说明被测试的代码本身不够合理,需要去关注代码本身的逻辑,设计是否合理,重构业务代码,让你的代码变得容易测试

因为代码的可测试性也是衡量代码质量的重要标准

Spock只是个工具,如果用它都无法解决你的单测case,那就需要把更多的注意力放在业务代码的设计上

总之Spock不能保证让你爱上写单测,但至少不会反感 ^_^

初衷

网上关于Spock的资料过于简单,包括官网的demo,无法解决我们项目中的复杂业务场景,需要找到一套适合自己项目的成熟解决方案

所以觉得有必要把我们项目中使用Spock的经验分享出来,帮助大家解决实际问题或带来一些启发,如果你在使用过程中遇到问题可以在公众号(Java老k)或我的博客www.javakk.com留言交流

参考资料

官网:
http://spockframework.org/

官网文档:
http://spockframework.org/spock/docs/1.3/all_in_one.html

github:
https://github.com/spockframework/spock

代码示例:
https://github.com/spockframework/spock-example


Java老K
36 声望12 粉丝

十年java老兵,现就职上海某一线互联网大厂,专注java技术,包括多线程并发,RXjava,JVM,Spring,Springboot,DDD,分布式中间件Dubbo,kafka,redis,微服务等,不定期分享面试题和业界最新动态以及人生感悟。