在对象上模拟一些方法

只需使用 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);
}