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
的检索值匹配。
将有关多次调用方法的问题交给我,并在基于模拟的单元测试中验证其方法不同的参数值。
学习愉快!