我正在尝试做的事情
我有一个看起来像这样的脚本:
def doStuff() {
println 'stuff done'
}
return this
我将这个脚本加载到另一个脚本中,这样我就有了一个Script
可以调用的 Groovy 对象doStuff
。这是在一个脚本中,调用它myscript.groovy
看起来像这样:
Script doer = load('doStuff.groovy')
doer.doStuff()
我希望能够模拟由stubScript
返回的对象,并断言它被调用。理想情况下,类似于以下内容(假设已经被模拟):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
特别是在一个测试中,我想模拟一个特定的实用程序方法并断言它是根据管道的参数调用的。
因为这些脚本目前未经测试,相当复杂,所以我对它们很陌生,许多不同的项目都依赖于它们,我不愿意对代码的结构或模块化方式进行任何彻底的改变。