Mockito框架的简单使用
引入pom文件:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.5.0</version>
<scope>test</scope>
</dependency>
注意原本引入的为mockito-all的pom,如下,不过新的mockito已经统一采用上面的pom文件:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
利用包含了将要被模拟返回结果的方法的类,去创建mock模拟对象。
方式1:
采用Mockito的静态方法
HashMap map = Mockito.mock(HashMap.class);
方式2:
利用注解@Mock:
@Mock
private Student student;
并在使用该对象前,必须对该对象所在类进行mock注解初始化:
MockitoAnnotations.initMocks(this);
简单使用:
1、对调用方法的返回进行模拟
(1)正常调用方法并有返回值,对返回值的模拟
HashMap map = Mockito.mock(HashMap.class);
Mockito.when(map.get("abc")).thenReturn("123");
System.out.println(map.get("abc"));
上面代码返回结果为"123",第一行为创建mock下的map对象,第二行为调用mockito的静态方法,表示了:如果map调用了get方法,且get方法的入参为"abc",则返回值为"123"。这其中要求when内的mock下的对象调用方法,必须有返回值,且返回值的类型定义必须与thenReturn内的值相符合。
如:
Mockito.when(map.containsKey("abc")).thenReturn("123");
是不可以的,因为map.containsKey()的返回结果必须是boolean。
(2)调用有返回值的方法,模拟异常:
对于方法调用产生异常的处理如下:表示如果map调用get方法时传入参数为"abc",就报异常。
HashMap map = Mockito.mock(HashMap.class);
Mockito.when(map.get("abc")).thenThrow(new RuntimeException("参数不能为abc"));
System.out.println(map.get("abc"));
(3)调用无返回值的方法,模拟异常:
有的时候模拟的方法在被调用时抛出异常,且正常执行时没有返回值,则写法如下:
Student student = Mockito.mock(Student.class);
Mockito.doThrow(new RuntimeException("参数不能为abc")).when(student).setSname("abc");
student.setSname("abc");
(4)连环调用模拟:
mockito可以利用链式编程处理同一个方法的多次调用产生不同结果,如下:
Mockito.when(map.get(1)).thenReturn("a").thenReturn("b").thenThrow(new RuntimeException("不能三次传入参数1"));
System.out.println(map.get(1));
System.out.println(map.get(1));
System.out.println(map.get(1));
表示:map调用get(1)的模拟返回结果,第一次调用返回"a",第二次调用返回"b",第三次调用直接抛出异常。
2、方法的调用与否与次数验证
调用与否:
(1)方法被调用(有且只有一次)
Mockito.verify(map).get(2);
表示map是否调用了get方法(有且只有一次)且传入参数为2。
(2)方法不被调用
Mockito.verify(map, Mockito.never()).get(2);
与上面相反,表示map是否没有调用get方法且传入参数为2。
(3)方法被调用了规定的次数
Mockito.verify(map, Mockito.times(5)).get(2);
表示map是否调用了指定次数的get方法且传入参数为2。
3、入参校验器
(1)Mockito自带的校验器
如:
Mockito.when(map.get(Mockito.anyLong())).thenReturn("这是一个Long");
System.out.println(map.get(11L));
map的get方法的入参只要符合long就会返回信息。
(2)Mockito自定义入参校验器
在校验器内重写ArgumentMatcher接口,如果重写了入参校验器接口定义的规则,则返回thenReturn内的值。如下:
Mockito.when(map.get(Mockito.argThat(new ArgumentMatcher<Integer>() {
@Override
public boolean matches(Integer integer) {
return integer>9;
}
}))).thenReturn("这是一个两位数");
System.out.println(map.get(11));
在执行map的get方法,如果入参符合校验器内定义的大于9的规则,则返回信息"这是一个两位数",本例入参为11,则会返回。
上一篇: 进口红酒有哪些品牌?