使用Spock使用存根方法模拟Groovy Script对象?

时间:2017-05-05 19:39:56

标签: jenkins groovy jenkins-pipeline spock jenkins-pipeline-unit

我想做什么

我有一个看起来像这样的脚本:

def doStuff() {
    println 'stuff done'
}

return this

我在另一个脚本中加载此脚本,以便我有一个Groovy Script对象,我可以从中调用doStuff。这是一个脚本,称之为myscript.groovy,如下所示:

Script doer = load('doStuff.groovy')
doer.doStuff()

我希望能够模拟Script,stub load返回的doStuff对象,并断言它被调用。理想情况下,类似于以下内容(假设load已被模拟):

given:
Script myscript = load('myscript.groovy')

Script mockDoer = Mock(Script)

when:
myscript.execute()

then:
1 * load('doStuff.groovy') >> mockDoer
1 * mockDoer.doStuff()

然而,我正在接受NPE:

doer.doStuff()

如何以一种方式模拟Script对象,以确保doStuff方法在我的测试中被存根并正确调用?

为什么我这样做

我知道这是一个奇怪的用例。我想我应该给出一些背景信息,为什么我要尝试这样做,以防人们想要提出完全不同的做法,这可能不适用于我想要做的事情。

我最近开始研究一个使用一些相当复杂的Jenkins Pipeline脚本的项目。为了在某​​种程度上模块化脚本,实用程序函数和不同管道的各个部分包含在不同的脚本中,并且加载和执行与doStuff.groovy之上的类似。

我正在尝试对脚本进行一些小改动,同时使用此库引入一些测试:https://github.com/lesfurets/JenkinsPipelineUnit

特别是在一个测试中,我想模拟一个特定的实用程序方法,并根据管道的参数断言它被调用。

因为这些脚本目前尚未经过测试,相当复杂,我不熟悉它们,许多不同的项目依赖于它们我不愿意对代码的结构或模块化进行任何彻底的改变。

0 个答案:

没有答案