【问题标题】:Byte-buddy and cglib not available in Spock test字节伙伴和 cglib 在 Spock 测试中不可用
【发布时间】:2019-06-02 01:56:29
【问题描述】:

我开始使用 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 或 byte-buddy 在运行时不可用引起的。

考虑到spock-core's pom lists both byte-buddy and cglib as compile dependencies,为什么它们没有在运行时保留?换句话说,为什么我们需要在我们的 build.gradle 文件中显式添加以下运行时依赖?

testRuntime "net.bytebuddy:byte-buddy:1.9.3" 

【问题讨论】:

    标签: unit-testing gradle groovy dependencies spock


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答,我不知道仅编译依赖项!
    【解决方案2】:

    它们是可选的依赖项,因此如果您需要该功能,则需要包含它们

    https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html

    【讨论】:

      猜你喜欢
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      • 2017-07-20
      相关资源
      最近更新 更多