Spock框架编写SwapTwoNumber交换数字测试用例不生效问题
测试运行失败的原因
- Java值传递机制限制:Java中基本数据类型作为参数传递时是值传递,方法内部拿到的只是参数的副本,你在
swapNumber方法内对形参a、b的修改仅作用于方法栈内的副本,方法执行结束后不会影响外部传入的原始变量,哪怕调用真实的类方法也无法实现外部变量交换。 - Spock测试写法错误:你使用
Mock()创建了SwapTwoNumber的代理对象,Mock对象默认不会执行真实的类方法逻辑,就算swapNumber逻辑正确,调用Mock对象的方法也不会触发你写的交换代码。
修复方案
Java语言层面无法通过基本类型参数实现外部变量交换,需要调整待测试类的参数设计,使用引用类型承载要交换的数值,同时修正Spock测试的写法:
- 修改待测试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]; } }
- 修改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
相关产品推荐
相关产品推荐

