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

时间:2016-05-09 06:46:35

标签: java refactoring tdd

我正在尝试关注TDD并且对它有点新意。我有一个要实现的接口(Java)。

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

但是,正如我看到主类的大小正在增长,我将主类分解为单独的类。但对于某些子类,我意识到最好单独测试它们并在主类测试用例中模拟它们。

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

我是否在实施TDD方法方面做错了什么?

1 个答案:

答案 0 :(得分:3)

听起来你正确地做对了。但是,有几点要做。重申以确保我们在同一页上:

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

  • 重构B出A
  • 为B编写测试(借鉴A的测试)
  • 删除由B
  • 测试复制的A测试
  • 如果合适,重写剩余的一个或多个A的测试,这些测试依赖于B中现在的功能来使用B的模拟

一些建议:

  • 在解压缩助手类之后,您可以删除测试帮助程序类功能的主类的所有测试(或可能是几个)。因此,您不应该对需要重写的主类进行多次测试。

    例如,如果主类为一个人建模并且辅助类根据其给定的名称,姓氏,标题等构造该人的全名,则主类最初将对该功能进行多次测试:给定名称与多个,标题与无标题等。您将为助手类编写等效测试,然后删除除了一个与全名构造有关的主类测试之外的所有测试。你需要在主类中留下一个测试,它测试它知道如何构造某种全名;如果您错误地删除了对助手类的调用或类似的话,该测试将失败。

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

  • 此过程确实需要重新测试测试和代码。 通过提前思考并尽快进行重构来最大限度地减少返工,一旦你说服自己会有所帮助。我发现当我认为我需要提取课程时我通常是对的;我很少在以后上课。因此,积极地提取类通常不会导致额外的工作,而是通过更快地获得正确的对象模型来最小化它。