Jenkins Spock测试mock http-request插件httpRequest步骤报错如何解决
问题原因
- 你引入http_request插件时使用了
@jar限定符,仅拉取了jar包,没有包含插件的步骤描述符元数据,导致JenkinsPipelineSpecification无法自动识别httpRequest步骤,所以需要显式声明mock - 显式mock后出现空指针是Spock的mock规则导致:你在setup块提前定义了mock返回值,又在then块单独声明调用次数,Spock会优先匹配then块的交互声明,覆盖之前的返回值配置,默认返回null,调用
resp.status就触发空指针
解决方法
方案一:调整依赖(推荐,无需显式mock)
修改build.gradle中的依赖配置,拉取包含完整插件元数据的hpi包,框架就能自动识别httpRequest步骤:
testImplementation 'org.jenkins-ci.plugins:http_request:1.10@hpi'
然后调整测试代码的mock写法,把调用计数和返回值绑定写在then块即可:
def "a test"() { setup: def webhook = 'aWebhook' def template = '%replaceMe' def values = ['%replaceMe': 'hello world!'] def mapper = new SimpleTemplateMapper() when: helper.sendTemplate(webhook, template, values, mapper) then: 1 * getPipelineMock('httpRequest')(_) >> [status: 200] }
方案二:保留原依赖,修正显式mock写法
如果不想调整依赖,就保留显式mock声明,同时修正mock的配置方式,把返回值和调用计数绑定:
def "a test"() { setup: def webhook = 'aWebhook' def template = '%replaceMe' def values = ['%replaceMe': 'hello world!'] def mapper = new SimpleTemplateMapper() explicitlyMockPipelineStep('httpRequest') when: helper.sendTemplate(webhook, template, values, mapper) then: 1 * getPipelineMock('httpRequest')(_) >> [status: 200] }
内容的提问来源于stack exchange,提问作者Nunuzac
相关产品推荐
相关产品推荐

