我在工作和家里开始TDD(我知道我迟到了)。我已经对类的公共方法进行了多次测试。但是我编写的许多类都有很多受保护的函数。在创建测试类时,我是否应该将其子类化为要测试的类,以便我可以覆盖受保护的方法?
谢谢,
JEC
答案 0 :(得分:3)
欢迎。聚会永远不会太晚!
创建子类以访问私有或受保护的方法可能是最好的方法。它为您构建测试创建了最大的“表面”。
在其他情况下,我创建了子类,允许我测试一个被测试的类,将工厂和单例模式添加到被测试的类中,并帮助允许替换模拟对象。
答案 1 :(得分:3)
在理想的世界中,您不需要直接测试受保护的方法,而只需要通过公共接口进行测试。然而,当然世界并不理想,如果有充分的理由,我认为测试受保护的方法并不是一件坏事。
我认为是否要分类是否取决于受保护方法的性质:
如果它们是抽象的或空白的方法,旨在被子类覆盖,并且您想测试方法是否被调用,那么测试子类是一种很好的方法,如您可以使用子类作为拦截这些方法调用的方法并验证它们是如何被调用的等等。我要说的一点是要小心测试子类中的任何逻辑纯粹是为了验证方法调用。 ,否则你可能会引入可能会对你的测试产生负面影响的行为(例如,你可以轻松地将逻辑添加到测试子类中,导致给定的测试仅基于测试子类中的逻辑而不是逻辑在实际实施中)。
如果它们是设计用于向子类公开功能的类中的方法,那么我认为您不需要对被测试的类进行子类化。因为这些方法是受保护的范围,所以同一个包中的不同类可以访问它们,因此你需要做的就是让你的测试在同一个包中调用这些方法来测试它们(在我的书中通常是很好的做法,测试应该在同一个包中,但存储在不同的目录中。)
答案 2 :(得分:1)
您可以对类进行子类化以测试其受保护的接口。
或者您可以让模拟库执行子类化。根据受保护接口的作用,这可能更合适。
具体来说,如果基类使用模板方法模式,则将子类创建为模拟可能更好。如果基类只提供派生类使用的辅助函数,请考虑将它们放入一个单独的类中并将它们公开。
答案 3 :(得分:1)
您应该测试您班级的公共界面。 因此,您无需为私人或受保护成员编写单元测试。
您的私人和受保护成员在公共成员中被调用,因此当您测试您的公共成员时,所有私人和受保护成员也将被隐式测试。
答案 4 :(得分:0)
许多人认为你应该只测试一个类的公共方法。
子类化适用于受保护的属性和方法,但不适用于私有,内部等。
根据您使用的语言,您可以声明测试类和它测试的类是“朋友”,这样测试类就可以看到其他类的属性。