单元测试-JMockit中使用参数化(多参数)测试

开发人员在编码完成之后,完善代码的单元测试,有利于提高代码质量,减少Bug数blablabla……….废话不多说 直接上代码:

//用于计算a+b+c
@Data
public class CalculatorAbc {

    private int a;
    private int b;
    private int c;
    private CalculatorAb calculatorAb;
    public int add(int a, int b, int c) {
        return calculatorAb.add(a,b) + c;
    }
}

//用于计算a+b
@Data
public class CalculatorAb {

    private int a;
    private int b;

    public int add(int a, int b) {
        return a + b;
    }
}

假设现在A程序员要测试自己写的CalculatorAbc,但这个方法呢,又用到了B程序员写的CalculatorAb,B有可能是通过dubbo调用的别人的服务,所以就要把B写的calculatorAb.add()这个方法mocked掉,正常写法:

@RunWith(JMockit.class)
public class CalculatorAbcTest {

    @Tested
    CalculatorAbc calculatorAbc;

    @Injectable
    CalculatorAb calculatorAb;

    @Test
    public void testAdd(){
        new NonStrictExpectations(){
            {
                calculatorAb.add(anyInt, anyInt);
                result = 5;
            }
        };
        int res = calculatorAbc.add(1,4,2);
        Assert.assertEquals(7, res);
    }
}

然后问题就来了,我要是测试多组数据怎么办,改入参,期望?不仅麻烦,而且测试数据没有保存,再来看一下参数化(多参数)测试:

/**
 * 多参数测试
 */
@RunWith(Parameterized.class)
public class ParamCalculatorAbTest {

    private int expected;
    private int inputA;
    private int inputB;

    public ParamCalculatorAbTest(int expected,  int inputA, int inputB){
        this.expected = expected;
        this.inputA = inputA;
        this.inputB = inputB;
    }

    //参数数据准备
    @Parameterized.Parameters
    public static Collection<Object[]> t() {
        return Arrays.asList(new Object[][]{
                {8, 5, 3},
                {11, 7, 18},
                {0, 0, 0},
                {14, 8, 22}
        });
    }

    @Test
    public void testAdd() {
        CalculatorAb cal = new CalculatorAb();
        Assert.assertEquals(expected, cal.add(inputA, inputB));
    }

}

测试结果

利用参数化测试可以一次测试多组数据,测试数据生成位置统一,便于测试数据的准备和管理,也可通过文件读取等方式加载,准备测试数据

这么好的东西,不能和mocked结合怎么行

/**
 * 参数化mocked测试
 */
@RunWith(Parameterized.class)
public class ParamCalculatorAbcTest {

    @Tested
    CalculatorAbc calculatorAbc;

    @Injectable
    CalculatorAb calculatorAb;

    private int expected;
    private int mocked;
    private int inputA;
    private int inputB;
    private int inputC;

    public ParamCalculatorAbcTest(int expected, int mocked, int inputA, int inputB, int inputC){
        this.expected = expected;
        this.mocked = mocked;
        this.inputA = inputA;
        this.inputB = inputB;
        this.inputC = inputC;
    }

    @Parameterized.Parameters
    public static Collection<Object[]> t() {
        return Arrays.asList(new Object[][]{
                {8, 5, 2, 3, 3},
                {11, 7, 2, 5, 4},
                {0, 0, 0, 4, 0},
                {14, 8, 4, 5, 6}
        });
    }

    @Test
    public void testAdd(){

        new NonStrictExpectations(){
            {
                calculatorAb.add(anyInt, anyInt);
                result = mocked;
            }
        };

        int res = calculatorAbc.add(inputA,inputB,inputC);

        Assert.assertEquals(expected, res);
    }
}

测试结果:
测试结果

这样一来 所有的数据准备都可以放在@Parameterized.Parameters注解的方法下啦,把里面的数字换成你想要的属性或者对象,就可以一次完成多组数据的测试啦,最好能通过读取文件的方式准备数据,也有利于测试数据的本地化和代码的简洁性~(编者本意:这次没实现读文件的数据准备,下次更上…)(或许这种方法比较挫气,也或许有更好的方法,等待发掘…)
啦啦啦

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值