这一篇介绍在理论应用 Spock 的过程中如何把一些罕用的测试方法抽出来,封装成基类应用
BaseSpock
在后面几篇文章解说 Spock 联合 power mock 实现静态方法 mock 性能时,示例代码里常常会用到 LogUtils
等工具类的静态方法去记录日志,那咱们就能够把 LogUtils
类的 mock 代码抽到一个公共类中,而后咱们的测试类去继承咱们本人实现的公共类
比方咱们把公共类起名叫 BaseSpock.groovy
文件,那么继承它的子类就领有了模仿 LogUtils
静态方法的性能,而不必每个测试类独自去实现 mock LogUtils 日志的性能
代码如下:
/**
* Spock 基类
* @Author: www.javakk.com
* @Description: 公众号:Java 老 K
*/
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Sputnik.class)
@PrepareForTest([LogUtils.class])
@SuppressStaticInitializationFor(["com.javakk.spock.util.LogUtils"])
class BaseSpock extends Specification{void setup() {
println "Spock setup"
// mock 掉一些我的项目中罕用的类, 比方日志记录
PowerMockito.mockStatic(LogUtils.class)
......
}
}
BaseSpock
是咱们封装的 spock 基类,它继承 Specification
,在 setUp 办法外部对LogUtils
进行了 mock
BaseSpock
能够放在一个公共的我的项目中或作为 jar 的形式援用
也能够放在 src/main/groovy/ 上面作为一个公共类调用
而后原来用到 LogUtils
日志类的单元测试能够继承 BaseSpock
基类
class UserServiceStaticTest extends BaseSpock {
这样原来的单元测试就不必再去实现 mock LogUtils 日志类静态方法的性能了
如果你除了 LogUtils
这些罕用的类须要 mock 外,还须要 mock 其余的静态方法的话,应用后面介绍的 spock 联合 power mock 的用法即可,相似上面这样写:
@PrepareForTest([IDNumberUtils.class])
class UserServiceStaticTest extends BaseSpock {
以后的单元测试类须要 mock IDNumberUtils 类,能够应用 @PrepareForTest
注解,这样既能够应用基类 mock LogUtils 日志的性能,也能够给本人的单测类减少新的静态方法 mock 性能
有几点须要留神:
BaseSpock
的类型是 groovy 文件,这个是因为 Spock 内置的测试引擎在启动时会查看继承它的子类是否是 groovy 类型的文件,所以如果你要封装一个相似 BaseSpock
的基类,文件后缀不能是 .java
的,必须是 .groovy
的类型
所有的 Spock 单测类不能有本人的构造函数,因为单元测试的实例都是由 Spock 创立和治理的
Spock 单元测试代码的运行程序是:
setupSpec()
→ setup()
→ cleanup()
→ cleanupSpec()
setupSpec
相似于 Junit 的@beforeClass
setup
相似于 Junit 的@before
cleanup
相似于 Junit 的@after
cleanupSpec
相似于 Junit 的@afterClass