在物件上模擬一些方法

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