修改私有属性来 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