1.下面这段代码,我们该如何在尽量减少代码改动的情况下,通过重构代码来提高代码的可测试性呢?
将单例类中新增一个用于获取测试instance的函数,命名getTestInstance(User testUser),该函数中把需要的测试用例通过参数传入instance当中,当要做测试时就可以通过getTestInstance函数来获取实例得到需要的测试数据.
public boolean validateCachedUser(long userId) {
User actualUser = userRepo.getUser(userId);
//User cachedUser = CacheManager.getInstance().getUser(userId);//生产使用
User cachedUser = CacheManager.getTestInstance(actualUser).getUser(userId);//测试使用
// 省略核心逻辑:对比cachedUser和actualUser...
}
2.第二次传递进去的参数是不生效的,而构建的过程也没有给与提示,这样就会误导用户。这个问题如何解决呢?
第二次调用getInstance时如果带有与之前相同参数就直接返回instance实例;如果参数不相同且业务允许构建新的instance实例就允许再第二次getInstance时构建新的实例,如果业务不允许就在构建时抛出异常.
public synchronized static Singleton getInstance(int paramA, int paramB) {
if (instance == null) {
instance = new Singleton(paramA, paramB);
} else if (this.paramA != paramA || this.paramB != paramB) {
//instance = new Singleton(paramA, paramB);// 业务允许
throw new RuntimeException("Singleton has been created!");// 业务不允许
}
return instance;
}
展开