JMockit:在 Verifications 中使用 withCapture 捕获参数


#Java Jmockit#


示例

被测试类:

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");
    }

}

捕获 add 方法的参数

package demo;

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

public class CalculatorTest {

    @Test
    public void test_add_01() {
        Calculator calculator = new Calculator();

        // 录制
        new Expectations(calculator) {{
            calculator.add(anyInt, anyInt);
            result = 1;
        }};

        // 执行
        int addResult = calculator.add(10, 11);
        Assert.assertEquals(1, addResult);

        // 验证
        new Verifications() {{
            int a;
            int b;
            calculator.add(a = withCapture(), b = withCapture());
            System.out.printf("捕获参数结果: a=%s, b=%s\n", a, b);
        }};
    }

}

执行结果:

捕获参数结果: a=10, b=11

若被录制的函数执行多次,则捕获的是最后一次的参数

package demo;

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

import java.util.ArrayList;
import java.util.List;

public class CalculatorTest {

    @Test
    public void test_add_01() {
        Calculator calculator = new Calculator();

        // 录制
        new Expectations(calculator) {{
            calculator.add(anyInt, anyInt);
            result = 1;
        }};

        // 执行
        int addResult = calculator.add(10, 11);
        Assert.assertEquals(1, addResult);
        addResult = calculator.add(110, 111);
        Assert.assertEquals(1, addResult);

        // 验证
        new Verifications() {{
            int a;
            int b;
            calculator.add(a = withCapture(), b = withCapture());
            System.out.printf("捕获参数结果: a=%s, b=%s\n", a, b);
        }};
    }

}

执行结果:

捕获参数结果: a=110, b=111

捕获所有执行过的参数

package demo;

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

import java.util.ArrayList;
import java.util.List;

public class CalculatorTest {

    @Test
    public void test_add_01() {
        Calculator calculator = new Calculator();

        // 录制
        new Expectations(calculator) {{
            calculator.add(anyInt, anyInt);
            result = 1;
        }};

        // 执行
        int addResult = calculator.add(10, 11);
        Assert.assertEquals(1, addResult);
        addResult = calculator.add(110, 111);
        Assert.assertEquals(1, addResult);

        // 验证
        new Verifications() {{
            List<Integer> a = new ArrayList<>();
            List<Integer> b = new ArrayList<>();
            calculator.add(withCapture(a), withCapture(b));
            System.out.printf("捕获参数结果: a=%s, b=%s\n", a, b);
        }};
    }

}

执行结果:

捕获参数结果: a=[10, 110], b=[11, 111]

( 本文完 )