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

使用Spock进行嵌套Mock与Stub时返回null的问题求助

问题解决:Spock Mock ResultSetMetaData.getColumnName 返回null

问题根源

你在mock ResultSetMetaData 的getColumnName方法时,错误使用了_ as int作为参数匹配器,这不符合Spock的mock语法规则,导致mock无法正确匹配方法调用,进而返回默认值null。

修复方案

直接使用Spock内置的参数匹配器_来匹配任意int类型参数,或者更精确地匹配构造函数中实际传入的1(因为循环里是c+1,第一次调用传入的是1)。

修改后的测试代码

def "initialising a SQL table"() {
    given:
    def COL_NAME = "someColumnName"
    def mockResSetMeta = Mock(ResultSetMetaData) {
        getColumnCount() >> 1
        // 方案1:匹配任意int参数
        getColumnName(_) >> COL_NAME
        // 方案2:精确匹配构造函数中实际传入的1,更严谨
        // getColumnName(1) >> COL_NAME
    }

    and:
    def mockResSet = Mock(ResultSet) {
        getMetaData() >> mockResSetMeta
    }

    and:
    def mockStatement = Mock(Statement) {
        executeQuery(_) >> mockResSet
    }

    and:
    def mockConn = Mock(Connection) {
        createStatement() >> mockStatement
    }

    when: "SqlTable object"
    def table = new SqlTable(mockConn, "some query")

    then: "the table contains the categorical column"
    table.columns[0].getName() == COL_NAME
}

补充说明

Spock的参数匹配器_会自动适配方法参数的类型,不需要额外的类型转换。当你试图将_强制转换为int时,会导致匹配器失效,mock无法识别对应的方法调用,只能返回默认的null值。

内容的提问来源于stack exchange,提问作者Luigi D.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:55:20