# Mockito – 验证具有不同参数的多个方法调用

> 原文： [https://howtodoinjava.com/mockito/verify-multiple-method-arguments/](https://howtodoinjava.com/mockito/verify-multiple-method-arguments/)

学习编写[单元测试](https://howtodoinjava.com/mockito/junit-mockito-example/)，该单元测试使用不同的参数多次调用一个方法，然后分别验证方法调用和方法参数。

## 1\. 验证具有不同参数的多个方法调用

给定的单元测试模拟了[`HashMap`](https://howtodoinjava.com/java-hashmap/)类，并在`put(key, value)`代码中调用了两次。 然后，它验证该方法已被调用两次。 该测试进一步分别验证所有不同的方法参数。

```java
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.times;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class MockitoExample 
{
	@Mock
	HashMap<String, Integer> hashMap;

	@Captor
	ArgumentCaptor<String> keyCaptor;

	@Captor
	ArgumentCaptor<Integer> valueCaptor;

	@Test
	public void saveTest() 
	{
		hashMap.put("A", 10);
		hashMap.put("B", 20);

		//1\. Verify method was invoked N times

		Mockito.verify(hashMap, times(2)).put(keyCaptor.capture(), valueCaptor.capture());

		List<String> keys = keyCaptor.getAllValues();
		List<Integer> values = valueCaptor.getAllValues();

		//2\. Verify method argument values as list

		assertEquals(Arrays.asList("A", "B"), keys);
		assertEquals(Arrays.asList(Integer.valueOf(10), Integer.valueOf(20)), values);

		//3\. Verify method arguments separately

		assertEquals("A", keys.get(0));
		assertEquals("B", keys.get(1));

		assertEquals(Integer.valueOf(10), values.get(0));
		assertEquals(Integer.valueOf(20), values.get(1));
	}
}

```

## 2\. 解释

为了捕获并验证多次调用某个方法时传递给该方法的所有方法参数，我们将遵循以下步骤：

*   使用`Mockito.verify(mock, times(n))`验证方法是否已执行`'n'`次。
*   创建与方法中的参数数量一样多的`ArgumentCaptor`实例。 在上面的示例中，我们测试了适用于键值对的`HashMap`，因此我们创建了两个`ArgumentCaptor`实例–一个用于键，另一个用于值。
*   使用`ArgumentCaptor.getAllValues()`检索所有执行期间传递给一个方法参数的所有值。 它返回传递的参数值的`List`。
*   我们可以使用`assertEquals(expected, result)`来验证预期的多个参数是否与`ArgumentCaptor`的检索值匹配。

将有关多次调用方法的问题交给我，并在基于模拟的单元测试中验证其方法**不同的参数**值。

学习愉快！