我在项目中第一次使用Junit,我对它迫使我重构代码的方式很着迷。我注意到的一件事是,我为了能够测试代码块而创建的对象数量正在显着增加。这是典型的吗?
谢谢,
埃利奥特
答案 0 :(得分:1)
是的,我认为这是相当典型的。当我开始将测试代码引入遗留代码库时,我发现自己创建了较小的实用程序类和pojos并对其进行测试。原始类只是成为调用这些较小类的包装器。
一个例子是当你有一个方法进行计算,更新一个对象然后保存到数据库。
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
}
所以我介绍了两个新对象,一个计算器&计算。这使我可以测试计算结果,而无需提供数据库。我也可以对更新方法进行单元测试。它也更具功能性,我喜欢: - )
如果我继续使用原始方法进行测试,那么我必须对计算udpate进行单元测试并保存为一个项目。哪个不好。
对我而言,第二个是更好的代码设计,更好的关注点分离,更小的类,更容易测试。但是小班的人数增加了。但整体复杂性下降了。
答案 1 :(得分:1)
是的,这是正常的。
通常,您的类和方法越小/越集中,就越容易理解和测试它们。这可能会产生更多的文件和实际的代码行,但这是因为您添加了更多的抽象,使您的代码具有更好/更清晰的设计。
您可能想了解Single Responsibility Principle。鲍勃叔叔在他的书Clean Code中也有一些重新考虑的例子,他在这一点上触及了这些要点。
进行单元测试时还有一件事。在构建代码时,Dependency Injection是最重要的事情之一,它可以为您节省很多麻烦。 (只是为了澄清,DI不会导致你有更多的课程,但它会帮助你的课程更多地分开。)
答案 2 :(得分:0)
取决于您所指的对象类型。通常情况下,使用像EasyMock或Mockito这样的模拟框架应该没问题,在这种情况下,仅用于测试目的所需的附加类的数量应该相当少。如果您在主要源代码中引用其他对象,可能是单元测试正在帮助您重构代码以使其更具可读性和可重用性,这无论如何都是一个好主意恕我直言: - )