如何模拟外部脚本使用的方法?

How can I mock a method an external script uses?

这是 Jenkins 特有的,但希望有一个通用的 groovy 功能可以帮助我。

我有一个 groovy 脚本 (myCustomStep.grooy) 我想进行单元测试。它必须像下面这样写(它不能是 class)。它将包括在 Jenkins 运行 期间可用但在本地不可用的方法,我想模​​拟它们。

这是其中一个脚本和相应的测试。如何在不修改 myCustomStep.groovy 的情况下模拟 echo

# vars/myCustomStep.grooy
def call(Map config) {
  def paramOne = config.paramOne
  echo paramOne
}
 
class MyCustomStepTest {
  // I tried to define it here but I get "No signature of method: myCustomStep.echo()"
  def echo(message) {
    println "$message"
  }

  @Test
  public void "sdfsdfsdf"() throws Exception {
    def aaa = new GroovyShell().parse( new File( 'vars/myCustomStep.groovy' ) )
    aaa deployment: "sdlfsdfdsf"
  }
}

我不能让 myCustomStep.grooy 接受 echo 作为参数。有没有办法将猴子补丁 echo 放入 myCustomStep 命名空间?

编辑:我找到了一个简单的解决方案,但现在我想知道如何为所有测试将方法附加到 myCustomStep,而不必为每个测试重新定义。我尝试在 @Before 方法(使用 junit)中执行此操作,但 myCustomStep obj 不可用于测试。

class MyCustomStepTest {
    def myCustomStep = new GroovyShell().parse( new File( 'vars/myCustomStep.groovy' ) )

  @Test
  public void "sdfsdfsdf"() throws Exception {
    // how can I attach this once for use by all my tests?
    myCustomStep.echo = { String message -> println "$message" }
    myCustomStep deployment: "sdlfsdfdsf"
  }
}

编辑: 我只是对在哪里实例化对象感到困惑。看起来我只需要在 @before 方法之外创建对象,然后在其中更新它。

  @Before
  public void setUp() throws Exception {
    myCustomStep.echo = { String message -> println "$message" }
  }

  def myCustomStep = new GroovyShell().parse( new File( 'vars/myCustomStep.groovy' ) )

您可以使用如下方式将 echo 放入绑定中:

    Binding b = new Binding()
    b.echo = { println "Hello There" }
    def shell = new GroovyShell(b)
    def aaa = shell.parse( new File( 'ars/myCustomStep.groovy' ) )
    aaa deployment: "sdlfsdfdsf"