【发布时间】:2020-02-03 17:16:52
【问题描述】:
我有调用管道步骤方法(withCredentials)的共享库。我正在尝试在调用 myMethodToTest 时使用 sh 脚本正确调用 withCredentials 方法,但在迭代 withCredentials 闭包时遇到错误:
测试方法
class myClass implements Serializable{
def steps
public myClass(steps) {this.steps = steps}
public void myMethodToTest(script, credentialsId, dataObject) {
dataObject.myKeyValue.each {
steps.withCredentials([[
$class: ‘UsernamePasswordMultiBinding’, credentialsId: "${credentialsId}",
usernameVariable: 'USR', passwordVariable: 'PWD']]) {
steps.sh("git push --set-upstream origin ${it.branch}")
}
}
}
}
嘲讽
class Steps {
def withCredentials(List args, Closure closure) {}
}
class Script {
public Map env = [:]
}
测试用例
def "testMyMethod"(){
given:
def steps = Spy(Steps)
def script = Mock(Script)
def myClassObj = new myClass(steps)
def myDataObject = [
'myKeyValue' : [['branch' :'mock' ]]
]
when:
def result = myClassObj.myMethodToTest(script, credId, myDataObject)
then:
1 * steps.withCredentials([[
$class: 'UsernamePasswordMultiBinding',
credentialsId: "mycredId",
usernameVariable: 'USR',
passwordVariable: 'PWD'
]])
1 * steps.sh(shString)
where:
credId | shString
"mycredId" | "git push --set-upstream origin mock"
错误(它的变量在闭包中变为空)
java.lang.NullPointerException: Cannot get property 'branch' on null object
【问题讨论】:
-
这几乎是 this question 的副本,我已经一个多月来回答了。代码是准相同的,错误消息“调用太少”也是。您声称看到的 NPE 不会发生。您甚至没有将我的修复合并到您的示例代码中。如果您不能提出问题的可重现版本,而只是提出旧问题的副本,那么没有人可以帮助您。同样在问题标题中,您提到了一个间谍,但您的代码不包含任何内容。
-
我同意我错过了 Spy 但这不是以前提出的问题的重复,因为以前的代码具有“它”的可变性,并且在同一问题上添加 cmets 时,您只告诉我提出新问题和当我问新问题时,您说的是重复问题。如果我能得到已经发布的问题的答案,我自己不会花时间发布新问题,因为我不是在这里增加我的否。的问题,但得到一些帮助。
-
您只是从上一个问题中复制了原始的、未更正的伪代码,这就是为什么它是重复的。有错误的印刷双引号,测试中缺少的参数导致“调用太少”,
Steps类中缺少的方法导致另一个“调用太少”等等。所有这些我已经在我之前的答案中修复了,这也被接受了。为什么你不能只提供一个显示真正问题的工作样本而不是其他多个问题?你从来没有运行过自己的代码,否则你会注意到的。 -
此外,
Steps.withCredentials()类从不评估闭包,我也已经修复了。如果您将您的问题基于我之前的回答,而不是再次从不完整和有错误的代码开始,那么只有这样我们才会看到您抱怨的错误消息。我刚试过。然后 Leonard 的回答解决了您的应用程序类中的问题,但不是您的示例代码中的所有其他问题。我将发布一个工作示例。
标签: groovy nullpointerexception spock spy