spock2 进行了较大的升级,基于 Junit5,基于 Groovy3(Groovy3 要求 JDK9+)
重要说明:不建议将您的现实项目迁移到 Spock 2.0 M1!这是 2.x 的第一个(预)发行版,未完成 API,旨在收集与内部 Spock 迁移到 JUnit Platform 有关的用户反馈。
JUnit Platform
提供支持Spock 2.0 M1
的主要变化是向JUnit 5
的迁移(确切地说,是使用JUnit Platform 1.5
(是JUnit 5
的一部分而不是JUnit 4
运行器 API 执行测试)。这非常方便,因为应该在支持 JUnit 平台的任何地方(IDE,构建工具,质量保障工具等)自动识别并执行Spock
测试。另外,平台本身提供的功能也应该也适用于Spock
。
要将 Spock 2 引入 Gradle 项目,需要修改 Spock 版本:
testImplementation('org.spockframework:spock-core:2.0-M1-groovy-2.5')
并通过 JUnit 平台激活测试执行:
test {
useJUnitPlatform()
}
另一方面,对于 Maven,仍然需要切换到 Never Spock 版本:
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>2.0-M1-groovy-2.5</version>
<scope>test</scope>
</dependency>
但这就是全部。如果找到了junit-platform-engine
(Spock 2 的传递依赖项),则Surefire
插件(如果使用版本 3.0.0+)默认执行JUnit Platform
测试。
由于具有向JUnit Platform
迁移的巨大变化,Spock 2.0 M1
中的其他变化数量有限,从而使查找潜在的回归原因变得容易一些。作为迁移本身的副作用,目前所需的 Java 版本是 8。
此外,所有参数化测试都会自动进行。但是,那太好了,目前还没有办法 “滚动” 特定的测试,如 Spock 1.x 的spock-global-unroll
所知。
SpockReportingExtension
在发行说明中可以找到一些其他更改(例如暂时禁用)。
使用JUnit 4 @Rule
的测试@ClassRule
可能会失败,并显示错误消息,提示未在测试(例如NullPointerException
或IllegalStateException: the temporary folder has not yet been created
)之前创建/初始化所请求的对象,或者在测试之后未进行验证/清除(例如,来自AssertJ
的软断言)。JUnit
平台不再支持Rules API
。但是,为了使迁移更容易(@TemporaryFolder
可能在基于Spock
的集成测试中经常使用),有一个专用工具spock-junit4
可以在内部将JUnit 4
规则包装到Spock
扩展中,并在Spock
的生命周期中执行它。由于它是作为全局扩展实现的,因此唯一需要添加的就是另一个依赖项。在 Gradle 中:
testImplementation 'org.spockframework:spock-junit4:2.0-M1-groovy-2.5'
或在 Maven 中:
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-junit4</artifactId>
<version>2.0-M1-groovy-2.5</version>
<scope>test</scope>
</dependency>
Spock 2.0 M1
仅使用Groovy 2.5.8
进行编译和测试。从M1
开始,当前在运行时阻止使用Groovy 3.0
执行。不幸的是,没有关于不兼容的 Groovy 版本的明确错误消息,只有一个非常隐秘的错误消息:
Could not instantiate global transform class org.spockframework.compiler.SpockTransform specified at
jar:file:/.../spock-core-2.0-M1-groovy-2.5.jar!/META-INF/services/org.codehaus.groovy.transform.ASTTransformation
because of exception java.lang.reflect.InvocationTargetException
令人遗憾的是,仅对Groovy 2.5
的限制减少了使用Groovy 3
工作的人们的潜在反馈,该反馈非常接近稳定版本(RC2)。由于许多Spock
测试仅适用于Groovy 3
(特别是某些极端情况),因此特别不方便。Spock 2 在发行版之前可能会被调整为 Groovy 3 中的更改已提供兼容性,或者至少会取消上述硬性限制。