You need to enable JavaScript to run this app. Spock框架编写SwapTwoNumber交换数字测试用例不生效问题
优惠活动
大模型
产品
解决方案
定价
更多

Spock框架编写SwapTwoNumber交换数字测试用例不生效问题

测试运行失败的原因
  • Java值传递机制限制:Java中基本数据类型作为参数传递时是值传递,方法内部拿到的只是参数的副本,你在swapNumber方法内对形参a、b的修改仅作用于方法栈内的副本,方法执行结束后不会影响外部传入的原始变量,哪怕调用真实的类方法也无法实现外部变量交换。
  • Spock测试写法错误:你使用Mock()创建了SwapTwoNumber的代理对象,Mock对象默认不会执行真实的类方法逻辑,就算swapNumber逻辑正确,调用Mock对象的方法也不会触发你写的交换代码。
修复方案

Java语言层面无法通过基本类型参数实现外部变量交换,需要调整待测试类的参数设计,使用引用类型承载要交换的数值,同时修正Spock测试的写法:

  1. 修改待测试Java类,使用数组包装需要交换的两个数字:
public class SwapTwoNumber {
    public void swapNumber(int[] arr){
        if(arr == null || arr.length != 2) {
            throw new IllegalArgumentException("仅支持长度为2的数组");
        }
        arr[0] = arr[0] + arr[1];
        arr[1] = arr[0] - arr[1];
        arr[0] = arr[0] - arr[1];
    }
}
  1. 修改Spock测试代码,使用真实实例而非Mock对象,调整验证逻辑:
import spock.lang.Specification

class SwapTwoNumberTest extends Specification{
    def "swap two number as given: #a and #b"() {
     given:
      int[] arr = [5, 6]
      SwapTwoNumber sw = new SwapTwoNumber()
     when:
      sw.swapNumber(arr)
     then:
      arr[0] == 6
      arr[1] == 5
    }
}

内容的提问来源于stack exchange,提问作者Raushan Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 09:54:08