Spock测试中不提供字节预算和cglib

时间:2019-06-01 17:13:29

标签: unit-testing gradle groovy dependencies spock

我开始使用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" 

2 个答案:

答案 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