You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 23:36:01