首页 > 解决方案 > 有没有办法覆盖 Spock 测试中的闭包?

问题描述

虽然这是针对 Jenkins 代码的,但我认为这个问题更普遍地是关于 Groovy 的元编程特性。

这是我的测试的样子:

// MyDeclarativePipelineTest.groovy
class MyDeclarativePipelineTest extends DeclarativePipelineTest {
  @Override
  @Before
  public void setUp() throws Exception {
    super.setUp();
    helper.registerAllowedMethod("parameters", [ArrayList.class], null)
  }
}

// someTests.groovy
class someTests extends MyDeclarativePipelineTest {
  @Override
  @Before
  public void setUp() throws Exception {
    super.setUp();
  }

  @Test
  public void pipeline_should_execute_without_errors() throws Exception {
    addParam('MYPARAM', 'sdfsdfsdf')

    def script = loadScript("Jenkinsfile")
    script.run()
    assertJobStatusSuccess()
  }
}

// Jenkinsfile
pipeline {
    stages {
        stage('Build') {
            steps {
                If(true) {print("sdfsdfsd")} // should fail because not wrapped in script{} step
                echo 'Building..'
            }
        }
    }
}

我在我的 Spock 测试中使用这个库:JenkinsPipelineUnit

我想在 MyDeclarativePipelineTest 类中覆盖 steps{} 闭包

步骤闭包在此类StageDeclaration.groovy中定义

StageDeclaration 在GenericPipelineDeclaration类中使用,如下所示:

def stage(String name,
          @DelegatesTo(strategy = DELEGATE_FIRST, value = StageDeclaration) Closure closure) {
    this.stages.put(name, createComponent(StageDeclaration, closure).with { it.name = name; it })
}

最后在DeclarativePipelineTest中使用 GenericPipelineDeclaration,如下所示:

def pipelineInterceptor = { Closure closure ->
    GenericPipelineDeclaration.binding = binding
    GenericPipelineDeclaration.createComponent(DeclarativePipeline, closure).execute(delegate)
}

我正在用我自己的类 MyDeclarativePipelineTest 扩展 DeclarativePipelineTest

有没有办法可以覆盖 MyDeclarativePipelineTest 内部的步骤关闭?steps{}如果未包装在闭包中的闭包中定义了原始 Groovy 代码,我希望它抛出错误script{}

标签: jenkinsgroovyjenkins-pipelinejenkins-groovy

解决方案


推荐阅读