如何模拟外部脚本使用的方法?
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"
这是 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"