在TDD中测试私有方法的替代方法

时间:2012-01-06 22:09:20

标签: tdd

在编写需要解析XML文档的类时,我正在尝试使用TDD。假设该类称为XMLParser,其构造函数接受一个字符串,用于解析XML文件的路径。我想有一个Load()方法尝试将此XML加载到内存中,并对文件执行一些检查,例如文件系统错误,无论是否是XML文件等。

我的问题是关于替代方案:我已经读过,使用您需要测试的私有方法是不好的做法,并且您应该能够只测试公共接口并让私有方法做他们的事情。但在这种情况下,此功能非常重要,我认为它不应公开。

有没有人对这样的场景有好的建议?

3 个答案:

答案 0 :(得分:3)

我建议稍微重新设计一下你的架构。目前,您有一个嵌入了低级功能的高级类。将其拆分为属于不同层的多个类(我在这里使用术语“层”)。

示例:

  1. 让一个班级具有当前班级的公共界面。 ( - >高级别图层)
  2. 让一个班负责从磁盘加载文件并处理IO错误( - >低级别图层)
  3. 让一个班负责验证XML文档( - > Inbetween)
  4. 现在你可以独立测试所有这三个类了!

    你会发现你的高级课程只不过是只编写两个较低级别的课程。

答案 1 :(得分:1)

使用no access修饰符(下一个属于私有)并在同一个包中编写测试。

良好的OOD很重要,但对于非常重要的功能测试更为重要。良好实践始终只是一个指导原则,在一般情况下它们都很好。

您还可以尝试将该特定文件检查行为封装在另一个对象中,并让您的解析器将其实例化并使用它。这可能就是我要做的。通过这种方式,您甚至可以轻松地在其他地方使用此功能。

答案 2 :(得分:0)

您可以将子类作为测试包的一部分,将公共访问器公开给私有方法(然后应该受到保护)。

Public class TestableClass : MyClass
{
    public someReturnType TestMethod() {
        return base.PrivateMethod();
    }
}