Mockito 参数匹配
精确匹配
我们之前介绍过这样的例子:
import org.junit.Assert; import org.junit.Test; import java.util.List; import static org.mockito.Mockito.*; public class MockitoDemo { @Test public void test() { List mockList = mock(List.class); Assert.assertEquals(0, mockList.size()); Assert.assertEquals(null, mockList.get(0)); mockList.add("a"); // 调用 mock 对象的写方法,是没有效果的 Assert.assertEquals(0, mockList.size()); // 没有指定 size() 方法返回值,这里结果是默认值 Assert.assertEquals(null, mockList.get(0)); // 没有指定 get(0) 返回值,这里结果是默认值 when(mockList.get(0)).thenReturn("a"); // 指定 get(0)时返回 a Assert.assertEquals(0, mockList.size()); // 没有指定 size() 方法返回值,这里结果是默认值 Assert.assertEquals("a", mockList.get(0)); // 因为上面指定了 get(0) 返回 a,所以这里会返回 a Assert.assertEquals(null, mockList.get(1)); // 没有指定 get(1) 返回值,这里结果是默认值 } }
其中when(mockList.get(0)).thenReturn("a");
指定了get(0)
的返回值,这个 0 就是参数的精确匹配。我们还可以让不同的参数对应不同的返回值,例如:
import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.List; import static org.mockito.Mockito.*; public class MockitoDemo { @Mock private List<String> mockStringList; @Before public void before() { MockitoAnnotations.initMocks(this); } @Test public void test() { mockStringList.add("a"); when(mockStringList.get(0)).thenReturn("a"); when(mockStringList.get(1)).thenReturn("b"); Assert.assertEquals("a", mockStringList.get(0)); Assert.assertEquals("b", mockStringList.get(1)); } }
对于精确匹配,还可以用 eq,例如:
import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.List; import static org.mockito.Mockito.*; public class MockitoDemo { @Mock private List<String> mockStringList; @Before public void before() { MockitoAnnotations.initMocks(this); } @Test public void test() { mockStringList.add("a"); when(mockStringList.get(eq(0))).thenReturn("a"); // 虽然可以用eq进行精确匹配,但是有点多余 when(mockStringList.get(eq(1))).thenReturn("b"); Assert.assertEquals("a", mockStringList.get(0)); Assert.assertEquals("b", mockStringList.get(1)); } }
模糊匹配
可以使用 Mockito.anyInt()
匹配所有类型为 int 的参数:
import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.List; import static org.mockito.Mockito.*; public class MockitoDemo { @Mock private List<String> mockStringList; @Before public void before() { MockitoAnnotations.initMocks(this); } @Test public void test() { mockStringList.add("a"); when(mockStringList.get(anyInt())).thenReturn("a"); // 使用 Mockito.anyInt() 匹配所有的 int Assert.assertEquals("a", mockStringList.get(0)); Assert.assertEquals("a", mockStringList.get(1)); } }
anyInt 只是用来匹配参数的工具之一,目前 mockito 有多种匹配函数,部分如下:
函数名 | 匹配类型 |
---|---|
any() | 所有对象类型 |
anyInt() | 基本类型 int、非 null 的 Integer 类型 |
anyChar() | 基本类型 char、非 null 的 Character 类型 |
anyShort() | 基本类型 short、非 null 的 Short 类型 |
anyBoolean() | 基本类型 boolean、非 null 的 Boolean 类型 |
anyDouble() | 基本类型 double、非 null 的 Double 类型 |
anyFloat() | 基本类型 float、非 null 的 Float 类型 |
anyLong() | 基本类型 long、非 null 的 Long 类型 |
anyByte() | 基本类型 byte、非 null 的 Byte 类型 |
anyString() | String 类型(不能是 null) |
anyList() | List<T> 类型(不能是 null) |
anyMap() | Map<K, V> 类型(不能是 null) |
anyCollection() | Collection<T> 类型(不能是 null) |
anySet() | Set<T> 类型(不能是 null) |
any(Class<T> type) |
type类型的对象(不能是 null) |
isNull() | null |
notNull() | 非 null |
isNotNull() | 非 null |
转载:https://www.letianbiji.com/java-mockito/mockito-parameter-match.html