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

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

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

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

MockitoExample.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

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

学习愉快!

saigon has written 1440 articles

Leave a Reply