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

JUnit4参数化测试两数交换报参数数量错误的修复方案

JUnit4 两数交换参数化测试报错修复

报错信息

编写两数交换功能的JUnit4参数化测试用例时,抛出如下异常:

java.lang.IllegalArgumentException: wrong number of arguments: 4 expected: 2.

分场景修复方案

场景1:被测方法入参为int数组

被测方法为Swap_Array.swap,入参为长度2的int数组,返回值同为长度2的int数组。
报错原因:@Parameters标注的测试数据集构造逻辑错误,将输入数组元素、预期结果数组元素平铺为4个独立int值,和测试类构造函数定义的2个数组类型入参不匹配,触发参数数量校验异常。

原有业务代码(Swap_Array.java)

package BasicTesting;

import java.io.*;
import java.lang.reflect.Array;
import java.util.Scanner;
public class Swap_Array
{
  public static void main(String args[])throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      int i;
    
      int [] array=new int[2];
      Scanner sc=new Scanner(System.in);
      System.out.println("Enter the two numbers");
      for(i=0;i<2;i++) {
          array[i] =sc.nextInt();
      }
      int [] p = swap(array);
      System.out.println("after swapping first number"+" "+p[0]+" "+" and second number are"+" " +p[1]);
    }

    public static int[] swap(int array[]) {
     int[] c=new int[2];
     int i = array[0];
     int j = array[1];
      
    i=i+j;
    j=i-j;
    i=i-j;
    c[0]=i;
    c[1]=j;
    return c;
  }
}

原有错误测试代码

package BasicTesting;

import static org.junit.Assert.*;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class Swap_Parameterized_testcase {
    public Swap_Parameterized_testcase(int[] input,  int[] expected) {
        super();
        this.input= input;
        this.expected = expected;
    }

    Swap_Array ob=new Swap_Array();
    private int input[];
    private int [] expected;

    @Parameters
    public static Collection<Object[]> testPrime() {
        // 错误写法:将数组元素平铺为4个独立参数,和构造函数的2个入参不匹配
        return Arrays.asList(new Object[][]{{1,2,2,1},{23,44,44,23}});
    }
    
    @Test
    public void Swap_test() {
        assertArrayEquals(expected,ob.swap(input));
    }
}

修正后测试代码

package BasicTesting;

import static org.junit.Assert.*;

import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class Swap_Parameterized_testcase {
    private int[] input;
    private int[] expected;
    private Swap_Array ob = new Swap_Array();

    public Swap_Parameterized_testcase(int[] input, int[] expected) {
        this.input = input;
        this.expected = expected;
    }

    @Parameters
    public static Collection<Object[]> testData() {
        return Arrays.asList(new Object[][]{
                // 每组数据2个参数,和构造函数入参顺序、类型对应:输入数组、预期返回数组
                {new int[]{1,2}, new int[]{2,1}},
                {new int[]{23,44}, new int[]{44,23}}
        });
    }

    @Test
    public void Swap_test() {
        assertArrayEquals(expected, ob.swap(input));
    }
}

场景2:被测方法入参为两个独立int值

被测方法为Swap_Numbers.swap1,入参为两个独立int类型值,返回值为长度2的int数组。

原有业务代码(Swap_Numbers.java)

package BasicTesting;

import java.io.*;
import java.lang.reflect.Array;
import java.util.Scanner;
public class Swap_Numbers
{
  public static void main(String args[])throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      int i,j;
    System.out.println("enter first number..");
    i=Integer.parseInt(br.readLine());
    System.out.println("enter second number..");
    j=Integer.parseInt(br.readLine());
    int[] p=swap1(i,j);
    
      System.out.println("after swapping first number"+" "+p[0]+" "+" and second number are"+" " +p[1]);
    }

    public static int[] swap1(int i,int j) {
     int[] c=new int[2];
      
    i=i+j;
    j=i-j;
    i=i-j;
    c[0]=i;
    c[1]=j;
    return c;
  }
}

正确参数化测试代码

package BasicTesting;

import static org.junit.Assert.*;

import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class Swap_Numbers_Parameterized_Test {
    private int inputA;
    private int inputB;
    private int[] expected;
    private Swap_Numbers ob = new Swap_Numbers();

    // 构造函数入参和测试数据集的每组元素一一对应
    public Swap_Numbers_Parameterized_Test(int inputA, int inputB, int[] expected) {
        this.inputA = inputA;
        this.inputB = inputB;
        this.expected = expected;
    }

    @Parameters
    public static Collection<Object[]> testData() {
        return Arrays.asList(new Object[][]{
                // 每组3个参数:第一个输入值、第二个输入值、预期交换后的返回数组
                {1, 2, new int[]{2,1}},
                {23, 44, new int[]{44,23}}
        });
    }

    @Test
    public void swap1Test() {
        assertArrayEquals(expected, ob.swap1(inputA, inputB));
    }
}

编写注意点

  • JUnit4参数化测试要求@Parameters返回的集合中,每个Object[]子数组的元素数量、顺序、类型必须和测试类构造函数的入参完全一致
  • 数组类型的参数不要将内部元素平铺,要直接传入完整数组对象

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 02:30:54