1

我在工作和家里都开始 TDD(我知道我迟到了)。我已经对类的公共方法进行了几次测试。然而,我编写的许多类都有很多受保护的函数。在创建测试类时,我是否应该让它成为要测试的类的子类,以便我可以覆盖受保护的方法?

谢谢,

耶克

4

5 回答 5

3

在理想情况下,您不需要直接测试受保护的方法,而只需通过公共接口进行测试。但是,当然,世界并不理想,如果有充分的理由,我认为测试受保护的方法并不是一件坏事。

我认为是否子类取决于受保护方法的性质:

  • 如果它们是被设计为被子类覆盖的抽象或空白方法,并且您想测试这些方法是否被调用,那么测试子类是执行此操作的好方法,因为您可以使用子类类作为拦截这些方法调用并验证它们的调用方式等的一种方式。我要说的一件事是要小心,测试子类中的任何逻辑纯粹是为了验证方法调用,否则你可能会引入行为这可能会对您的测试产生负面影响(例如,您可以轻松地将逻辑添加到测试子类中,这会导致给定测试仅基于测试子类中的逻辑而不是实际实现中的逻辑通过)。

  • 如果它们是旨在向子类公开功能的类中的方法,那么我认为您不需要对被测类进行子类化。因为方法是受保护的范围,同一个包中的不同类可以访问它们,因此您需要做的就是在同一个包中进行测试以调用这些方法来测试它们(在我的书中这通常是一个很好的做法,测试应该在同一个包中但存储在不同的目录中)。

于 2013-08-14T13:15:43.580 回答
3

欢迎。派对永远不会太晚!

创建子类来访问私有或受保护的方法可能是最好的方法。它为您构建测试创造了最大的“表面”。

在其他情况下,我创建了子类以允许我检测被测类,将工厂和单例模式添加到被测类,并帮助允许替换模拟对象。

于 2013-08-14T12:28:40.460 回答
1

您可以对该类进行子类化以测试其受保护的接口。

或者您可以让模拟库进行子类化。根据受保护接口的作用,这可能更可取。

具体来说,如果基类使用模板方法模式,那么将子类创建为模拟可能会更好。如果基类只是为派生类提供帮助函数,请考虑将它们放入单独的类中并公开。

于 2013-08-14T12:30:53.550 回答
1

你应该测试你的类的公共接口。因此,您无需为私有或受保护成员编写单元测试。

您的私有和受保护成员在公共成员内部被调用,因此当您测试您的公共成员时,所有私有和受保护成员也将被隐式测试。

于 2013-08-14T13:02:50.470 回答
0

许多人会争辩说你应该只测试一个类的公共方法。

子类化适用于受保护的属性和方法,但不适用于私有、内部等。

根据您使用的语言,您可以将测试类及其测试的类声明为“朋友”,以便测试类可以看到其他类的属性。

于 2013-08-14T13:19:57.553 回答