使用 Mockito 修改私有屬性

修改私有屬性來 Mock 可能不是一種很好的測試方式, 由於屬性名是動態的,但有時不得已而爲了,例以下面的代碼:函數

public class UserService {
    private ExternalApi external = ExternalApi.default();
    private UserDao userDao;測試

    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }this

    public 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

相關文章
相關標籤/搜索