我开始使用Spock测试框架,我的build.gradle
依赖项部分如下所示:
dependencies {
testCompile "org.spockframework:spock-core:1.3-groovy-2.5"
}
我有一个(无用的)Spock测试,需要创建存根:
def 'A test that will fail'() {
given: ''
def random = Stub(Random)
}
启动后,测试失败并显示给定错误:
CannotCreateMockException:无法为类java.util.Random创建模拟。非接口类型的模拟需要代码生成库。请在类路径上放置最新版本的byte-buddy或cglib-nodep。
Spock documentation中提到了此错误,原因是cglib或字节伙伴在运行时不可用。
考虑到spock-core's pom lists both byte-buddy and cglib as compile dependencies,为什么在运行时不保留它们?换句话说,为什么我们需要在build.gradle文件中明确添加以下运行时依赖项?
testRuntime "net.bytebuddy:byte-buddy:1.9.3"
答案 0 :(得分:1)
因为( byte-buddy 和 cglib-nodep )都标记为Follower.objects.bulk_create([
Follower(follower=john, following=paul),
Follower(follower=john, following=ringo),
Follower(follower=ringo, following=paul),
Follower(follower=george, following=ringo)
])
,所以从Gradle的角度来看,它们都标记为{{1} }依存关系-参见:https://blog.gradle.org/introducing-compile-only-dependencies
仅编译依赖项与常规依赖项有明显不同 编译依赖项。它们不包括在运行时类路径中 并且它们是非传递性的,这意味着它们不包含在其中 依赖项目。
答案 1 :(得分:1)
它们是可选的依赖项,因此,如果需要该功能,则需要包含它们
https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html