jenkinsgroovymockingjenkins-pipelinejenkins-pipeline-unit

Mocking findFiles in JenkinsPipelineUnit


Currently I'm trying to register findFiles step. My set up is as follows:

src/
    test/
        groovy/
            TestJavaLib.groovy
vars/
    javaLib.groovy
javaApp.jenkinsfile

Inside TestJavaApp.groovy I have:

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

and my javaLib.groovy contains this currently failing part:

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

I have tried multiple closures returning various objects, but everytime I get NPE. Question is - how to correctly register "findFiles" method?

N.B. That I'm very new to mocking and closures in groovy.


Solution

  • So I found a way on how to mock findFiles when I needed length property:

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

    This also allows to change findFilesLength variable in tests to test different conditions in pipeline like the one in my OP.