乐趣区

关于java:Spock单元测试框架实战指南八-常用mock封装成基类

这一篇介绍在理论应用 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
退出移动版