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,则会返回。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值