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

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

原文: https://howtodoinjava.com/mockito/verify-multiple-method-arguments/

学习编写单元测试,该单元测试使用不同的参数多次调用一个方法,然后分别验证方法调用和方法参数。

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

给定的单元测试模拟了HashMap类,并在put(key, value)代码中调用了两次。 然后,它验证该方法已被调用两次。 该测试进一步分别验证所有不同的方法参数。

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的检索值匹配。

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

学习愉快!