【问题标题】:Jenkins Pipeline Shared Library using @Grab breaks Spock tests使用 @Grab 的 Jenkins Pipeline 共享库打破了 Spock 测试
【发布时间】:2019-02-23 03:04:06
【问题描述】:

我正在尝试按照此处的“使用共享库扩展”说明将第 3 方库添加到我的管道共享库代码中:

https://jenkins.io/doc/book/pipeline/shared-libraries

@GrabResolver(name='custom', root='http://my.nexus/maven')
@Grab("com.packageA.serviceA:artifactA:1.0.0")

import com.packageA.serviceA.ClassA

这失败了,因为找不到 IvySettings 类。在另一个 StackOverflow 帖子之后:

Getting Class Not Found: org.apache.ivy.core.report.ResolveReport when using GroovyClassLoader in Java

我必须将它添加到我的 pom.xml:

    <dependency>
        <groupId>org.apache.ivy</groupId>
        <artifactId>ivy</artifactId>
        <version>2.4.0</version>
    </dependency>

我解决了 IvySettings not found 问题。但是我为添加 @Grab 的类的所有 Spock 单元测试都失败了

java.lang.NoClassDefFoundError: com.mypackage.pipeline.client.MyClient
    at java.lang.Class.forName(Class.java:348)
    at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:386)
    at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:219)
    at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
    at net.sf.cglib.proxy.Enhancer.createClass(Enhancer.java:317)
    at org.spockframework.mock.runtime.ProxyBasedMockFactory$CglibMockFactory.createMock(ProxyBasedMockFactory.java:91)
    at org.spockframework.mock.runtime.ProxyBasedMockFactory.create(ProxyBasedMockFactory.java:49)
    at org.spockframework.mock.runtime.GroovyMockFactory.create(GroovyMockFactory.java:66)
    at org.spockframework.mock.runtime.CompositeMockFactory.create(CompositeMockFactory.java:44)
    at org.spockframework.lang.SpecInternals.createMock(SpecInternals.java:45)
    at org.spockframework.lang.SpecInternals.createMockImpl(SpecInternals.java:281)
    at org.spockframework.lang.SpecInternals.GroovyMockImpl(SpecInternals.java:199)
    at myRollbackTest.Missing object(myRollbackTest.groovy:184)

这些测试使用 GroovyMock 和 GroovySpy。

有没有人让 Grab 与 Spock 的 GroovyMock/Spy 一起工作?

【问题讨论】:

  • 如果没有可复现的测试用例 (MCVE) 恐怕没人能帮你。
  • 好点。但我想我有一个理论。将在下面发布答案

标签: jenkins groovy jenkins-pipeline spock


【解决方案1】:

我试图在 src/com/packageA/serviceA 中的非 PSL 代码上添加 @Grab,即:不在 var/* 下。

根据 Jenkins 文档,@Grab 仅适用于流水线共享库代码。

我通过使用@Grab 管道共享库函数解决了这个问题,并从 src/com/packageA/serviceA 中的非 PSL 代码调用此函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 2020-04-25
    • 2020-04-13
    • 1970-01-01
    • 2018-02-23
    • 2017-04-30
    • 1970-01-01
    相关资源
    最近更新 更多