首页 > 解决方案 > 使用 Spock 和 jenkins-spock 模拟 Jenkins 内部函数

问题描述

我想要做的是创建一个返回模拟的方法模拟,这样我就可以测试一个类的以下disconnectNode 方法。我试图模拟的是 getJenkinsNode 方法中的 getNode 和 toComputer 调用。

Computer getJenkinsNode(String nodeName) {
    return Jenkins.getInstanceOrNull().getNode(nodeName).toComputer()
}

def disconnectNode(String nodeName) {
    def offlineCause = 'Maintenance'
    def node = getNode(nodeName)
    node.setTemporarilyOffline(true, new OfflineCause.ByCLI(offlineCause))
}

但是,我还没到。我正在尝试弄清楚为什么我不能让一个模拟返回另一个模拟。

使用jenkins-spock和 Spock 我设法做了以下测试规范,只是为了试图找出问题所在

import com.homeaway.devtools.jenkins.testing.JenkinsPipelineSpecification
import hudson.model.Computer
import hudson.model.Node
import jenkins.model.Jenkins

class MaintenanceSpec extends JenkinsPipelineSpecification {

    def 'Script does not fail or throw exceptions'() {
        given:
        Computer computer = Mock()

        Node node = Mock()
        node.toComputer() >> computer

        Jenkins jenkins = getPipelineMock('Jenkins')
        jenkins.getNode('Node 1') >> node

        when:
        System.out.println(jenkins.getNode('Node 1').toString())
        System.out.println(computer.toString())
        System.out.println(jenkins.getNode('Node 1').toComputer().toString())
        System.out.println(node.toComputer().toString())

        then:
        noExceptionThrown()
    }
}

测试后打印的消息是。

Mock for type 'Node' named 'node'
Mock for type 'Computer' named 'computer'
null
null

结果真的很混乱。通过第一次打印,我可以看出 getNode 函数正在按预期返回模拟节点。通过第二次打印,我可以看出 Computer 类的模拟已创建。但是第 3 次和第 4 次打印返回 null 所以问题出在方法 toComputer 的模拟上,但我不知道我做错了什么

有任何想法吗?

谢谢!

标签: jenkinsspockjenkins-spock

解决方案


推荐阅读