修改私有屬性來 Mock 可能不是一種很好的測試方式, 由於屬性名是動態的,但有時不得已而爲了,例以下面的代碼:函數
public class UserService {
private ExternalApi external = ExternalApi.default();
private UserDao userDao;測試public UserService(UserDao userDao) {
this.userDao = userDao;
}thispublic User findUserById(int id) {
return userDao.findById(external.convertId(id));
}code
測試時欲隔離對 ExternalApi 的外部依賴, 固然能夠把它也做爲構造函數的一個參數,這樣建立 UserService 實例時就能夠 Mock external 屬性。不過 external 常常是不變的,因此做爲方法參數的必要性也不大。這就但願能在構造出 UserService 以後對 external 私有屬性進行 Mock 處理。get
在 Mockito 1.x 和 2.x 下要使用不一樣的方式,分別使用到 Whitebox 和 FieldSetter 類,它們都來自於 mockito.internal.util.reflection
包,可見 Mockito 打心底不推薦直接使用它們,但誰叫它們是 public 的呢。還有一種方式是使用 PowerMock + Mockito, 這是後話。 閱讀全文 >>it