将私有方法改为公共方法以进行单元测试是一个好的实践。

4

最近,我在处理旧代码的单元测试案例时,写测试案例时遇到了一个问题。

由于我正在编写单元测试案例而不是集成测试案例。问题出在私有方法上。在我们的代码中,一个公共方法依赖于5个私有方法。

对于单元测试案例,我需要提供私有方法的虚拟实现,但由于该方法是私有的,我无法这样做。 因为MOQ模拟框架不支持私有方法的模拟功能。即使我也不能编写私有方法的测试案例。

我考虑的可能的方法

将所有私有方法移动到另一个类中。并将它们设为public,并创建此类的接口。这样,我就可以在运行时提供虚拟实现,因为现在我们有了该类的接口。

但是这种方法的问题是我需要将这些私有方法设置为public以进行单元测试案例。所以将其设置为public是一个好的做法。

1个回答

4

当我开始发现自己写了很多私有方法时,通常会将类分割。但您有几个选择:

  1. 只需完全测试公共接口。当然,您应该覆盖私有方法。

    • 对于那些所有功能都应保持在一起有意义的类非常有效。也就是说,类已经很好地抽象化并具有单一职责。
    • 如果将这些私有方法保留在类中意味着需要进行更多的模拟和设置,则可能会很麻烦。
  2. 您可以将您的私有方法设为internal,并将您的测试项目指定为友元程序集。然后它们可以直接进行单元测试。

    • 当不合理将类拆分时,此方法也可以有效。
    • 当您有许多私有方法由一个公共方法调用时,这种方法优于测试公共接口。如果您想测试其中某个私有方法的一部分,则无需设置公共方法所需的所有内容。这也使得事情更容易理解和调试。
  3. 您已经考虑过的解决方案是拆分类。有时,代码难以测试表明内部有一个正在尝试突破的类。

    • 如果您可以将一些或全部私有功能分组到一个命名实体中,则可能需要将其拆分。 特别是如果您还有其他情况可能可以重用这样的类。
    • 如果原始类具有大量依赖项列表,并且您可以使用此选项减少该列表,则这也是一个不错的选择。

最初我考虑采用第一种方法。但是这种方法的问题在于,很难覆盖私有方法内部的所有路径,因为该方法包含复杂的逻辑,因此单元测试用例会变得低效。 - Shobhit Walia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接