Mockito版本:1.9.5
Mockito是一款十分容易上手的Mock工具:
package com.sean;
public class User {
private String name;
private int age;
public User(){}
public User(String name, int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package com.sean;
public class UserBO {
public UserBO(){
System.out.println("UserBO INIT!");
}
public User getUser(String name) throws Exception{
System.out.println("Real getUser method is called!");
return new User("real", 99);
}
public boolean saveUser(User user) throws Exception{
System.out.println("Read saveUser method is called!");
return true;
}
}
package com.sean;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import org.junit.BeforeClass;
import org.junit.Test;
public class UserBOTest {
private static UserBO mockUserBO;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
mockUserBO = mock(UserBO.class);
}
@Test(expected=Exception.class)
public void testGetUser() throws Exception {
when(mockUserBO.getUser("sean"))
.thenReturn(new User("sean", 20));
when(mockUserBO.getUser("real"))
.thenCallRealMethod();
when(mockUserBO.getUser(""))
.thenThrow(new Exception("Parameter error!"));
doThrow(new Exception("Parameter error!"))
.when(mockUserBO).getUser(null);
User user = mockUserBO.getUser("sean");
assertTrue(user.getAge() == 20);
user = mockUserBO.getUser("real");
assertTrue(user.getAge() == 99);
user = mockUserBO.getUser(null);
verify(mockUserBO).getUser("real");
// verify(mockUserBO)等价于verify(mockUserBO, times(1))
// verify(mockUserBO, times(1)).getUser("real");
}
@Test
public void testSaveUser() throws Exception {
User user = new User();
doReturn(true).when(mockUserBO).saveUser(user);
// 这句和上面那句最终效果相同
// when(mockUserBO.saveUser(user)).thenReturn(true);
assertTrue(mockUserBO.saveUser(user));
}
}
运行结果如下:
控制台显示结果如下(可以发现并没有真正创建UserBO对象):
Real getUser method is called!