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());
}
}
结果: