精确匹配
我们之前介绍过这样的例子:
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 |