Byte-buddy 和 cglib 在 Spock 测试中不可用

use*_*612 5 groovy dependencies unit-testing gradle spock

我开始使用 Spock 测试框架,我的build.gradle依赖项部分如下所示:

dependencies {
    testCompile "org.spockframework:spock-core:1.3-groovy-2.5"
}
Run Code Online (Sandbox Code Playgroud)

我有一个(无用的)Spock 测试,需要创建一个存根:

def 'A test that will fail'() {
    given: ''
    def random = Stub(Random)
}
Run Code Online (Sandbox Code Playgroud)

启动后,测试失败并出现给定错误:

CannotCreateMockException:无法为类 java.util.Random 创建模拟。非接口类型的模拟需要代码生成库。请将最新版本的 byte-buddy 或 cglib-nodep 放在类路径上。

Spock文档中提到了这个错误,它是由 cglib 或 byte-buddy 在运行时不可用引起的。

考虑到spock-core 的 pom 将 byte-buddy 和 cglib 都列为编译依赖项,为什么它们在运行时不保留?换句话说,为什么我们需要显式地将以下运行时依赖添加到我们的 build.gradle 文件中?

testRuntime "net.bytebuddy:byte-buddy:1.9.3" 
Run Code Online (Sandbox Code Playgroud)

cgr*_*rim 1

因为两者(byte-buddycglib-nodep)都被标记为<optional>true</optional>,从 Gradle 的角度来看它们是compileOnly依赖项 - 请参阅:https://blog.gradle.org/introducing-compile-only-dependencies

仅编译依赖项与常规编译依赖项明显不同。它们不包含在运行时类路径中,并且是不可传递的,这意味着它们不包含在依赖项目中。