jenkins - 使用 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 的模拟上,但我不知道我做错了什么
有任何想法吗?
谢谢!