我第一次在项目中使用 JUnit,它迫使我重构代码的方式让我着迷。我注意到的一件事是,为了能够测试代码块而创建的对象数量正在显着增加。这是典型的吗?
是的,这是正常的。
一般来说,您的类和方法越小/越集中,就越容易理解和测试它们。这可能会产生更多文件和实际代码行,但这是因为您添加了更多抽象,使您的代码具有更好/更清晰的设计。
您可能想阅读单一责任原则。鲍勃叔叔在他的《干净代码》一书中也有一些重构示例,他在其中谈到了这些要点。 进行单元测试时还有一件事。
依赖注入是最重要的事情之一,它可以在构建代码时为您省去很多麻烦。 (为了澄清,DI 不一定会导致您有更多的类,但它将有助于您的类之间更多地解耦。)
一个例子是,当您有一个方法执行计算、更新对象然后保存到数据库时。
public void calculateAndUpdate(Thing t) {
calculate(t); // quite a complex calculation with mutliple results & updates t
dao.save(t);
}
您可以创建一个由计算方法返回的计算对象。然后该方法更新 Thing 对象并保存它。
public void calculateAndUpdate(Thing t) {
Calculation calculation = new Calculator().calculate(t); // does not update t at all
update(t, calculation); // updates t with the result of calculation
dao.save(t); // saves t to the database
}
所以我引入了两个新对象,计算器和计算。这使我能够测试计算结果,而无需拥有可用的数据库。我也可以对更新方法进行单元测试。它也更实用,我喜欢:-)
如果我继续用原来的方法测试,那么我就必须对计算更新进行单元测试并保存为一项。这不太好。
对我来说,第二个是更好的代码设计、更好的关注点分离、更小的类、更容易测试。但小班的数量却在增加。但整体复杂性下降了。