我有一个被很多地方使用的基类:
class base {
base(param1, param2 ...) // constructor 1, which is the legit constructor
base(param3, param4 ...) // constructor only for unit testing!!!
base(param5, param6 ...) // constructor only for unit testing!!!
}
是否有一种优雅的方式来处理这种情况?有一些构造函数仅用于测试确实令人困惑。我简化了上述情况,实际上我们有多个“真实”构造函数以及更多“假”构造函数。随着时间的流逝,人们开始使用伪造的构造函数,并且这种伪造的构造函数变得不可维护...实现此目标的更优雅的方法是什么?
答案 0 :(得分:0)
伪造的构造函数做什么却不能在您的测试代码中完成?
通常希望通过公共api进行测试,因为这定义了要确保正确实现的一组行为。
当您要测试的代码依赖于其他复杂对象时,您仍然可以使用公共api,但是这些依赖关系被模拟掉了。
另请参阅:https://testing.googleblog.com/2013/03/testing-on-toilet-testing-state-vs.html
答案 1 :(得分:0)
第一步,避免意外使用更多的其他构造函数:您可以使仅供测试private
使用的构造函数,并将测试类设为{{1} }。当然,这也可以用于替代异常的“测试构造函数”方法:例如,提供私有设置程序以允许更改对象状态以进行测试。
如果拥有更多构造函数的原因是为了简化测试设置:在测试中创建助手工厂函数可能会更优雅。这些将创建正确配置的friend
实例。例如,您可以使用工厂功能,例如base
或make_base_that_behaves_like_xxx
。然后,工厂函数将理想情况下调用“合法”构造函数,并根据需要对对象执行其他修改。与使用多个专用构造函数的方法相比,这甚至可以导致更好的可读性解决方案。
请注意,引入特殊的构造函数有时可能对解决遗留代码的测试问题很有用,但不能像新创建的代码的设计模式那样有用:Feathers以 Parameterize Constructor的名称描述它
em>。