Mockito的使用

来源:互联网 发布:软件商城下载 编辑:程序博客网 时间:2024/05/18 01:21

1. Mockito简介

    调用mock对象的方法时,不会执行真实的方法,而是返回类型的默认值,如object返回null, int返回0等,否则通过指定when(方法).thenReturn(value)来指定方法的返回值。同时mock对象可以进行跟踪,使用verify方法看是否已经被调用过。而spy对象,默认会执行真实方法,返回值可以通过when.thenReturn进行覆盖。可见mock只要避开了执行一些方法,直接返回指定的值,方便做其他测试。

2. 使用实例

    在maven中引入两个依赖:

 <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>4.12</version>            <scope>test</scope>        </dependency>        <!-- https://mvnrepository.com/artifact/org.mockito/mockito-core -->        <dependency>            <groupId>org.mockito</groupId>            <artifactId>mockito-core</artifactId>            <version>2.7.22</version>            <scope>test</scope>        </dependency>

    定义User对象:

package com.jessin.practice.bean;import com.fasterxml.jackson.annotation.JsonFormat;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.ObjectMapper;import org.springframework.beans.factory.InitializingBean;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;import java.util.Date;public class User implements InitializingBean{    private int id;    private Date birthday;    private String name;    public User(){    }    public int getId() {        id = 100;        System.out.println("id : " + id);        return id;    }    public void setId(int id) {        this.id = id;    }    public Date getBirthday() {        return birthday;    }    public void setBirthday(Date birthday) {        this.birthday = birthday;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String toString(){        ObjectMapper objectMapper = new ObjectMapper();        try {            return objectMapper.writeValueAsString(this);        } catch (JsonProcessingException e) {            e.printStackTrace();        }        return "";    }    public void afterPropertiesSet() throws Exception {        System.out.println(toString());    }}

2.1 mock默认值

package com.jessin;import com.jessin.practice.bean.User;import org.junit.Test;import static org.junit.Assert.assertEquals;import static org.mockito.Mockito.*;/** * Created by zexin.guo on 17-8-20. */public class UserTest {    @Test    public void testMockClass(){        User mockUser = mock(User.class);        // mock对象不设置返回时object默认返回null,不执行真实方法        assertEquals("tom", mockUser.getName());    }}

    结果:
这里写图片描述

2.2 mock指定返回值

package com.jessin;import com.jessin.practice.bean.User;import org.junit.Test;import static org.junit.Assert.assertEquals;import static org.mockito.Mockito.*;/** * Created by zexin.guo on 17-8-20. */public class UserTest {    @Test    public void testMockClass(){        User mockUser = mock(User.class);        // 指定返回tom        when(mockUser.getName()).thenReturn("tom");        // junit测试失败,期待返回tony        assertEquals("tony", mockUser.getName());    }}

    结果:
这里写图片描述

2.3 verify验证方法调用及调用次数

    定义一个Friend类:

package com.jessin.practice.bean;import java.util.List;/** * Created by zexin.guo on 17-8-21. */public class Friend {    private String userName;    private List<User> myFriends;    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public List<User> getMyFriends() {        return myFriends;    }    public void setMyFriends(List<User> myFriends) {        this.myFriends = myFriends;    }    public void printMyFriends(){        for(User user : myFriends){            System.out.println(user.getName());        }    }}

    结果:

@Test    public void testVerify(){        Friend friend = new Friend();        friend.setMyFriends(new ArrayList<User>());        User mockUser = mock(User.class);        // 如果不设置,返回null        when(mockUser.getName()).thenReturn("jessin");        friend.getMyFriends().add(mockUser);        // 照常打印名字        friend.printMyFriends();        // 验证该方法被调用一次        verify(mockUser).getName();    }

    结果:
这里写图片描述

2.4 spy调用真实方法

package com.jessin;import com.jessin.practice.bean.User;import org.junit.Test;import static org.junit.Assert.assertEquals;import static org.mockito.Mockito.*;/** * Created by zexin.guo on 17-8-20. */public class UserTest {    @Test    public void testMockClass(){        User mockUser = spy(User.class);        // 指定返回10,原本返回的100被覆盖了        when(mockUser.getId()).thenReturn(10);        // 测试通过        assertEquals(10, mockUser.getId());    }}

    结果:
这里写图片描述