在物件上模擬一些方法
只需使用 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);
}