EasyMock捕获参数

时间:2020-02-23 14:41:17  来源:igfitidea点击:

有时我们想对任何输入参数的行为进行存根,所以我们使用参数匹配器。
如果要在调用这些存根方法时知道参数,则必须使用捕获参数的匹配器。

EasyMock捕获参数

EasyMock捕获参数需要执行以下步骤:

  • 使用EasyMock.newCapture()方法创建Capture实例。

  • 使用capture(Capture)参数匹配器和expect来匹配任何参数,并捕获它以备后用。

  • 如果要捕获原始类型,则有特定的方法,例如captureInt()captureBoolean()等。

单参数捕获

如果捕获单个参数,则可以从Capture.getValue()方法获取其值。
让我们举一个简单的例子来说明单个论点。

package com.theitroad.easymock;

import static org.easymock.EasyMock.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.util.ArrayList;

import org.easymock.Capture;
import org.easymock.CaptureType;
import org.junit.jupiter.api.Test;

import com.theitroad.utils.MathUtils;

public class EasyMockCaptureAgrumentExample {

	@Test
	public void test_single_call_arg_capture() {
		ArrayList<String> mockList = mock(ArrayList.class);
		Capture<String> captureSingleArgument = newCapture();
		expect(mockList.add(capture(captureSingleArgument))).andReturn(true);
		replay(mockList);

		assertTrue(mockList.add("Hello Pankaj"));
		
		System.out.println(captureSingleArgument.getValue()); //Hello Pankaj
		
		verify(mockList);
	}
}

捕获多个呼叫的参数

如果多次调用存根方法,我们可以使用getValues()来获取参数列表。

@Test
public void test_multiple_calls_args_catcher() {
	ArrayList<Integer> mockList = mock(ArrayList.class);
	Capture<Integer> captureArguments = newCapture(CaptureType.ALL);
	expect(mockList.add(captureInt(captureArguments))).andReturn(true).times(2);
	replay(mockList);

	assertTrue(mockList.add(10));
	assertTrue(mockList.add(20));
	
	System.out.println(captureArguments.getValues()); //[10, 20]
	
	verify(mockList);
}

捕获多个参数

我们还可以捕获多个参数方法。
我们可以将不同的Capture实例用于不同的参数类型,也可以使用相同的实例。

@Test
public void test_multiple_args_catcher() {
	MathUtils mock = mock(MathUtils.class);
	Capture<Integer> captureArguments = newCapture(CaptureType.ALL);

	expect(mock.add(captureInt(captureArguments), captureInt(captureArguments))).andReturn(10).times(2);
	replay(mock);

	assertEquals(mock.add(0,10), 10);
	assertEquals(mock.add(1, 9), 10);
	
	System.out.println(captureArguments.getValues()); //[0, 10, 1, 9]

	verify(mock);
}

注意,我在上面的示例中使用captureInt()来捕获整数参数。