JMockit:使用 Expectations 录制函数每次调用的返回值不同

介绍
使用 Expectations 录制函数行为,然后通过实际的单测逻辑重放录制的函数行为。

result 若出现多次,则根据调用顺序返回不同的值。returns 函数也可以用来设置多个返回值。

示例
被测试类
package demo;

public class Calculator {

// 非静态函数
public int add(int a, int b) {
    return a+b;
}

// 静态函数
public static int staticAdd(int a, int b) {
    return a+b;
}

// 空函数
public void noop() {
    System.out.println("没有被 mock");
}

}
示例:录制静态函数行为
package demo;

import mockit.Expectations;
import org.junit.Test;

public class CalculatorTest {

@Test
public void test_add_01() {

    new Expectations(Calculator.class) {{
        Calculator.staticAdd(1, 2); result = 1;
    }};

    System.out.println(Calculator.staticAdd(1, 2));
    System.out.println(Calculator.staticAdd(1, 2));
}

}
执行结果:

1
1
示例:通过多次设置 result 的值,让同一函数每次返回的结果不一样
package demo;

import mockit.Expectations;
import org.junit.Test;

public class CalculatorTest {

@Test
public void test_add_01() {
    new Expectations(Calculator.class) {{
        Calculator.staticAdd(1, 2);
        result = 1;   // 第1次调用时返回1
        result = 2;   // 第2次,以及之后的调用返回1
    }};

    System.out.println(Calculator.staticAdd(1, 2));
    System.out.println(Calculator.staticAdd(1, 2));
    System.out.println(Calculator.staticAdd(1, 2));
}

}
执行结果:

1
2
2
示例:通过设置 result 的值为数组,让同一函数每次返回的结果不一样
package demo;

import mockit.Expectations;
import org.junit.Test;

public class CalculatorTest {

@Test
public void test_add_01() {
    new Expectations(Calculator.class) {{
        Calculator.staticAdd(1, 2);
        result = new int[] {1, 2};
    }};

    System.out.println(Calculator.staticAdd(1, 2));
    System.out.println(Calculator.staticAdd(1, 2));
    System.out.println(Calculator.staticAdd(1, 2));
}

}
当有多个返回值时,可以用 returns 函数替代 result。

下面的代码和上面的代码效果相同:

package demo;

import mockit.Expectations;
import org.junit.Test;

public class CalculatorTest {

@Test
public void test_add_01() {
    new Expectations(Calculator.class) {{
        Calculator.staticAdd(1, 2);
        returns(1, 2);
    }};

    System.out.println(Calculator.staticAdd(1, 2));
    System.out.println(Calculator.staticAdd(1, 2));
    System.out.println(Calculator.staticAdd(1, 2));
}

}
示例:result 和 returns 混用,让同一函数每次返回的结果不一样
package demo;

import mockit.Expectations;
import org.junit.Test;

public class CalculatorTest {

@Test
public void test_add_01() {
    new Expectations(Calculator.class) {{
        Calculator.staticAdd(1, 2);
        returns(1, 2);
        result = 100;
    }};

    System.out.println(Calculator.staticAdd(1, 2));
    System.out.println(Calculator.staticAdd(1, 2));
    System.out.println(Calculator.staticAdd(1, 2));
    System.out.println(Calculator.staticAdd(1, 2));
}

}
执行结果:

1
2
100
100
如果一个函数被录制多次,会怎么样?
以最后一次录制为准。

示例代码:

package demo;

import mockit.Expectations;
import org.junit.Test;

public class CalculatorTest {

@Test
public void test_add_01() {
    new Expectations(Calculator.class) {{
        Calculator.staticAdd(1, 2);  // 第1次录制
        result = 1;
        Calculator.staticAdd(1, 2);  // 第2次录制
        result = 100;
    }};

    System.out.println(Calculator.staticAdd(1, 2));
    System.out.println(Calculator.staticAdd(1, 2));
    System.out.println(Calculator.staticAdd(1, 2));
    System.out.println(Calculator.staticAdd(1, 2));
}

}
执行结果:

100
100
100
100

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值