我有一个看起来像这样的脚本:
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
特别是在一个测试中,我想模拟一个特定的实用程序方法,并根据管道的参数断言它被调用。
因为这些脚本目前尚未经过测试,相当复杂,我不熟悉它们,许多不同的项目依赖于它们我不愿意对代码的结构或模块化进行任何彻底的改变。