【问题标题】:How to mock a custom step using JenkinsPipelineUnit?如何使用 JenkinsPipelineUnit 模拟自定义步骤?
【发布时间】:2018-09-23 21:37:47
【问题描述】:

我正在使用JenkinsPipelineUnit 来测试管道。我定义了一个自定义步骤,如下所示:

// vars/getOnlineNodes.groovy
import jenkins.model.Jenkins

def call() {
    Jenkins.get().nodes
            .findAll { it.toComputer().isOnline() }
            .collect { it.selfLabel.name }
}

并在我的测试中模拟它:

helper.registerAllowedMethod('getOnlineNodes', [], { ['node1', 'node2', 'node3'] })

但它会抛出异常java.lang.NoClassDefFoundError: javax/servlet/ServletException。我应该如何正确地做到这一点?

【问题讨论】:

    标签: jenkins jenkins-pipeline jenkins-pipeline-unit


    【解决方案1】:

    我找到了解决这个here 的方法。基本上,如果您在运行脚本之前模拟您的自定义步骤(一个函数),它将覆盖模拟,因为调用 runScript('my-script.jenkins') 时将加载该库:

    helper.registerAllowedMethod('getOnlineNodes', [], { ['node1', 'node2', 'node3'] })
    runScript('my-script.jenkins')
    

    你应该做的是加载脚本,然后模拟步骤,然后运行脚本,如下所示:

    def script = loadScript('my-script.jenkins')
    helper.registerAllowedMethod('getOnlineNodes', [], { ['node1', 'node2', 'node3'] })
    script.run()
    

    【讨论】:

    • 我发现这并不总是适合我。我想不通。我知道你必须完全匹配函数签名,我正在这样做,并且没有收到任何错误,但是模拟不起作用,而是调用了真正的函数。这主要是我正在运行的脚本中定义的函数的问题 - 外部函数很容易被模拟。
    • @MaxCascone:也许您应该最小化项目以缩小根本原因?如果这没有帮助,你能分享一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 2019-07-09
    相关资源
    最近更新 更多