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

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

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

但是,正如我看到主类的大小越来越大,我将主类打破成单独的类。 但对于某些子类,我意识到最好单独测试它们并在主类测试用例中模拟它们。

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

我在实施TDD方法方面做错了吗?

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

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

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

一些忠告:

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

    例如,如果主类为一个人建模并且辅助类从他们的给定名称,姓氏,标题等构造人的全名,那么主类最初将对该function进行许多测试:一个给定名称vs不止一个,标题与没有标题等等。您将为辅助类编写等效的测试,然后删除除了一个关于全名构造的主类测试之外的所有测试。 你需要在主类中留下一个测试,它测试它知道如何构造某种全名; 如果您错误地删除了对辅助类的调用或类似的东西,那么该测试将失败。

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

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