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


#Java Jmockit


介绍

使用 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


( 本文完 )