Jenkins PipelineUnit中的模拟FindFile

Jenkins PipelineUnit中的模拟FindFile,jenkins,groovy,mocking,jenkins-pipeline,jenkins-pipeline-unit,Jenkins,Groovy,Mocking,Jenkins Pipeline,Jenkins Pipeline Unit,目前我正在尝试注册FindFile步骤。 我的设置如下: src/ test/ groovy/ TestJavaLib.groovy vars/ javaLib.groovy javaApp.jenkinsfile 在TestJavaApp.groovy中,我有: ... import com.lesfurets.jenkins.unit.RegressionTest import com.lesfurets.jenkins.unit.B

目前我正在尝试注册FindFile步骤。 我的设置如下:

src/
    test/
        groovy/
            TestJavaLib.groovy
vars/
    javaLib.groovy
javaApp.jenkinsfile
在TestJavaApp.groovy中,我有:

...
import com.lesfurets.jenkins.unit.RegressionTest
import com.lesfurets.jenkins.unit.BasePipelineTest

class TestJavaLibraryPipeline extends BasePipelineTest implements RegressionTest {
    // Some overridden setUp() which loads shared libs
    // and registers methods referenced in javaLib.groovy

    void registerPipelineMethods() {
        ...
        def fileList = [new File("testFile1"), new File("testFile2")]
        helper.registerAllowedMethod('findFiles', { f -> return fileList })
        ...
    }
}
我的javaLib.groovy包含这个当前失败的部分:

    ...
    def pomFiles = findFiles glob: "target/publish/**/${JOB_BASE_NAME}*.pom"
    if (pomFiles.length < 1) { // Fails with java.lang.NullPointerException: Cannot get property 'length' on null object
        error("no pom file found")
    }
    ...
。。。
def pomFiles=findFiles glob:“target/publish/**/${JOB_BASE_NAME}*.pom”
如果(pomFiles.length<1){//与java.lang.NullPointerException一起失败:无法获取null对象的属性“length”
错误(“未找到pom文件”)
}
...
我尝试过多个返回各种对象的闭包,但每次我得到NPE。 问题是-如何正确注册“findFiles”方法

注意,我对groovy中的mock和闭包非常陌生。

看看,我看到了该方法()的一些重载:

  • void registerallowdmethod(字符串名称,列表参数=[],闭包)
  • void registeraldowedmethod(methodsignaturemethodsignature,Closure-Closure)
  • void registeraldowedmethod(methodsignaturemethodsignature,函数回调)
  • void registeraldowedmethod(methodsignaturemethodsignature,消费者回调)
  • 看起来您在通话中没有注册正确的签名。事实上,我很惊讶您当前的调用模式没有出现
    MissingMethodException

    您需要在注册期间添加方法签名的其余部分。
    findFiles
    方法采用参数的
    Map
    glob:“target/publish/**/${JOB\u BASE\u NAME}*.pom”
    是Groovy中的映射文字)。注册该类型的一种方法如下:

    helper.registerAllowedMethod('findFiles', [Map.class], { f -> return fileList })
    

    我也面临同样的问题。但是,我能够使用以下方法签名模拟findFiles()方法:

    helper.registerAllowedMethod(method('findFiles', Map.class), {map ->
                return [['path':'testPath/test.zip']]
            })
    

    因此,我找到了一种方法,可以在需要长度属性时模拟
    findFiles

    helper.registerAllowedMethod('findFiles',[Map.class],{[length:FindFileLength?:1]})


    这还允许在测试中更改
    findFileLength
    变量,以测试管道中的不同条件,如我的OP中的条件。

    即使我尝试不同的签名,我仍然会得到NPE。我的想法是,闭包返回的值不会传递给findFile,而findFile又不会传递给pomFiles变量,从而导致NPE。但由于缺乏经验,我还不知道如何排除故障。我还打开了PipelineUnit存储库上的帮助请求:。但上面提到的建议仍然没有帮助。我想一些关于如何调试这个问题的指针也会有所帮助。@zrks您能找到解决方案吗?我也面临着类似的问题。我在扩展BasePipelineTest的类中添加了void registerDeclarativeMethods(){helper.registerAllowedMethod('inside',[String.class],null)},但我仍然得到groovy.lang.MissingMethodException:没有方法签名:java.lang.String.inside()适用于参数类型:(字符串,com.dsl.shared.WindowService$\u createWindow\u closure15$\u closure25)值:[u root,com.dsl.shared.WindowService$\u createWindow\u closure15]$_closure25@60bd273d]@Angelina是的,这是我问题的解决方案-顺便说一句,检查什么参数类型采用“inside”方法