在对象上模拟一些方法
只需使用 spy()
of mockito 来模拟对象的某些方法。
例如,假设方法类需要一些 Web 服务才能工作。
public class UserManager {
List<User> users;
public UserManager() {
user = new LinkedLisk<User>();
}
public void addUser(User user) {
if (isValid(user)) {
user.add(user);
} else {
throw new NotValidUserException();
}
}
protected boolean isValid(User user) {
//some online web service to check if user is valid
}
public int numberOfUsers() {
return users.size();
}
}
必须对 addUser
方法进行测试才能对 UserManager
进行有用的测试。但是,在这里找到依赖关系,isValid
需要一个未包含在我们的代码中的外部 Web 服务。然后,应该中和这种外部依赖。
在这种情况下,如果你只是模拟 isValid
,你将能够测试其余的 UserManager
方法。
@Test
public void testAddUser() {
User user = mock(User.class);
UserManager manager = spy(new UserManager());
//it forces to manager.isValid to return true
doReturn(true).when(manager).isValid(anyObject());
manager.addUser(user);
assertTrue(manager.numberOfUsers(), 1);
}
你可以轻松检查 user
无效的情况。
@Test(expectedExceptions = NotValidUserException.class)
public void testNotValidAddUser() {
User user = mock(User.class);
UserManager manager = spy(new UserManager());
//it forces to manager.isValid to return false
doReturn(false).when(manager).isValid(anyObject());
manager.addUser(user);
}