使用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.
相关产品推荐
相关产品推荐

