java - 在 TDD 中,在重构期间将主类拆分为子类

标签 java refactoring tdd

我正在尝试遵循 TDD 并且对它有点陌生。我有一个要实现的接口(interface) (Java)。

所以我开始为接口(interface)行为编写测试用例,使它们失败并通过添加或修改代码来修复它们。

但是,当我看到主类的规模越来越大时,我将主类分成单独的类。但是对于一些子类,我意识到最好单独测试它们并在主类测试用例中模拟它们。

但是,当我这样做时,我不得不再次重写主类测试用例(对于移动的代码),导致大量流失和重复工作。

我在实现 TDD 方法时做错了什么吗?

最佳答案

听起来你做得对。但是,有几点需要说明。重申以确保我们在同一页面上:

从主类A中提取一个辅助类B,

  • 从 A 重构 B
  • 为 B 编写测试(借鉴 A 的测试)
  • 删除与 B 测试重复的 A 测试
  • 如果合适,重写 A 的剩余测试或依赖于 B 中现在功能的测试,以使用 B 的模拟

一些建议:

  • 在提取辅助类后,您可以删除主类中测试辅助类功能的测试,只保留一个(或几个)。因此,您不应该有太多需要重写的主类剩余测试。

    例如,如果主类为一个人建模,而辅助类根据他们的名字、姓氏、头衔等构造这个人的全名,那么主类最初将对该功能进行许多测试:一个给定名称与不止一个,标题与无标题等。您将为助手类编写等效测试,然后删除除一个关于全名构造的主类测试之外的所有测试。您确实需要在主类中留下一个测试,测试它是否知道如何构造某种全名;如果您错误地删除了对助手类的调用或类似的东西,该测试将失败。

  • 如果辅助类很简单(特别是,如果它没有需要特殊测试设置或导致速度缓慢的大量依赖项),则不必模拟它。 这可能会为您节省一些主类测试的重写。

  • 此过程确实需要对测试和代码进行返工。 通过提前思考并在确信重构会有所帮助后立即进行重构,从而最大限度地减少返工。我发现,当我认为我需要提取一个类时,我通常是对的;我以后很少需要内联类(class)。因此,积极地提取类通常不会导致额外的工作,而是通过更快地获得正确的对象模型来最大限度地减少它。

关于java - 在 TDD 中,在重构期间将主类拆分为子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37109329/

相关文章:

refactoring - 困惑的代码(几乎完成): refactor it now or later?

unit-testing - 我在哪里以及如何学习软件测试技术?

java - 混合快速排序 + 插入排序 java.lang.StackOverflowError

java - 如何在 Android 4.0 中获取 HttpClient 的响应

java - 是否应该关闭 doWork() 的 "connection"参数?

c - 尝试一起编译多个 CUDA 文件时出现链接错误 LNK2005

javascript - react : How do I move my ajax api call into a separate component?

c# - WCF、Unity、EntLib5、Linq-to-SQL 与 TDD 和 PI 的示例

unit-testing - React/Redux 应用程序的单元测试

java - STS Spring 与 Roo 和 Maven - 太慢了?