我们的团队已经获得了一个遗留系统,用于进一步的维护和开发。因为这是真正的“遗留”东西,所以测试的数量真的非常少,而且大部分都是废话。这是一个带有 Web 界面的应用程序,因此既有容器管理的组件,也有普通的 Java 类(不绑定到任何框架等),无论何时何地,它们都是“新版”的。
当我们使用这个系统时,每次我们接触给定的部分时,我们都会尝试将所有这些东西分解成更小的部分,发现和重构依赖关系,推送依赖而不是在代码中拉取它们。
我的问题是如何使用这样的系统,打破依赖,使代码更易测试等?何时停止以及如何处理?
让我给你看一个例子:
public class BillingSettingsAction {
private TelSystemConfigurator configurator;
private OperatorIdDao dao;
public BillingSettingsAction(String zoneId) {
configurator = TelSystemConfiguratorFactory.instance().getConfigurator(zoneId);
dao = IdDaoFactory.getDao();
...
}
// methods using configurator and dao
}
这个构造函数肯定做的太多了。另外为了测试它以进一步重构它需要使用 PowerMock 等做魔术。我要做的是将其更改为:
public BillingSettingsAction(String zone, TelSystemConfigurator configurator, OperatorIdDao dao) {
this.configurator = configurator;
this.dao = dao;
this.zone = zone;
}
或仅使用依赖项的设置器提供构造函数设置区域。
我看到的问题是,如果我在构造函数中提供依赖项,我仍然需要在某个地方提供它们。所以它只是将问题向上移动一个级别。我知道我可以创建工厂来连接所有依赖项,但是触摸应用程序的不同部分会导致每个工厂都有不同的工厂。我显然不能一次重构所有应用程序并在那里引入例如 Spring。
暴露设置器(可能提供了默认实现)是相似的,而且它就像只为测试添加代码。
所以我的问题是你如何处理这个问题?如何使对象之间的依赖关系更好、更易读、更可测试,而无需一次性完成?