4

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

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")
    }
    ...

我尝试了多个返回各种对象的闭包,但每次我得到 NPE。问题是 - 如何正确注册“findFiles”方法?

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

4

3 回答 3

1

查看GitHub 上的源代码和示例,我看到了该方法的一些重载(此处):

  1. void registerAllowedMethod(String name, List<Class> args = [], Closure closure)
  2. void registerAllowedMethod(MethodSignature methodSignature, Closure closure)
  3. void registerAllowedMethod(MethodSignature methodSignature, Function callback)
  4. void registerAllowedMethod(MethodSignature methodSignature, Consumer callback)

您似乎没有在通话中注册正确的签名。我真的很惊讶你没有得到MissingMethodException你当前的呼叫模式。

您需要在注册期间添加其余的方法签名。该findFiles方法采用一个Map参数(glob: "target/publish/**/${JOB_BASE_NAME}*.pom"是 Groovy 中的映射文字)。注册该类型的一种方法是这样的:

helper.registerAllowedMethod('findFiles', [Map.class], { f -> return fileList })
于 2018-02-13T17:52:06.683 回答
1

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

helper.registerAllowedMethod(method('findFiles', Map.class), {map ->
            return [['path':'testPath/test.zip']]
        })
于 2018-03-08T09:07:16.627 回答
0

findFiles所以我找到了一种在需要长度属性时如何模拟的方法:

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

这也允许更改findFilesLength测试中的变量以测试管道中的不同条件,例如我的 OP 中的条件。

于 2018-03-08T09:21:11.497 回答