在具体类上实现接口(interface)时,公开额外的公共(public)方法以帮助促进单元测试是否合适?
例如,假设我有以下具体类:
public class MyClass : IMyInterface
{
public int InterfaceMethod(ComplexObject complexObject)
{
return NonInterfaceMethodOne(complexObject)
+ NonInterfaceMethodTwo(complexObject);
}
public int NonInterfaceMethodOne(ComplexObject complexObject)
{
//Do complex logic that needs to be unit tested
}
public int NonInterfaceMethodTwo(ComplexObject complexObject)
{
//Do more complex logic that needs to be unit tested
}
}
如果我这样写我的类,我可以对两种非接口(interface)方法进行单元测试,但我觉得这种模式不正确。有没有更好的办法?
你那里的东西对我来说看起来完全可以接受。对您的问题的一般回答是“视情况而定”,因为在某些情况下您想要隐藏这些方法,也可能在某些情况下您想要公开它们。
将您的测试套件视为您的代码库的第一个客户端是合理的,并且支持您的客户端的需求是有意义的——您仍然需要仔细考虑您想要公开和隐藏的功能。
尽管 NonInterfaceMethodOne
和 NonInterfaceMethodTwo
都是公开的,但如果将此实现注入(inject)到接口(interface)类型的参数中,客户端仍然只能访问到接口(interface)方法,并且不知道其他 2 个方法。
使用实现的客户端当然可以访问所有 3 个方法,但仍然不知道接口(interface)方法是如何实现的。
如果公开这些方法以进行单元测试有用,并且您可以确定将这些方法公开不会造成任何损害,那么请将它们公开。
但是,编写测试以确保 NonInterfaceMethodOne
和 NonInterfaceMethodTwo
以您想要的方式工作,然后用另一个测试覆盖您的接口(interface)方法可能仍然是合适的),然后您可能不再需要涵盖 NonInterfaceMethodOne
和 NonInterfaceMethodTwo
的单元测试——在这种情况下,您可以删除这些测试,然后制作 NonInterfaceMethodOne
和 NonInterfaceMethodTwo
是私有(private)的——因为覆盖接口(interface)方法的单元测试覆盖了其他 2 种方法。
- 如果您发现这种方法没有隐藏您的测试套件需要的任何功能,我会倾向于这种方法,因为通常最好限制您公开的功能