我仍处于关于单元测试的学习阶段,特别是关于模拟(我正在使用PascalMock和DUnit框架)。我现在偶然发现的一件事是,我找不到将测试类/接口的实现细节硬编码到我的单元测试中的方法,而且感觉不对……
例如:我想测试一个类,它实现了一个非常简单的接口,用于读取和写入应用程序设置(基本上是名称/值对)。呈现给消费者的界面完全不知道值的实际存储位置和方式(例如注册表、INI 文件、XML、数据库等)。自然地,访问层是由另一个不同的类实现的,该类在构造时被注入到测试类中。我为此访问层创建了一个模拟对象,现在我能够完全测试接口实现类,而无需实际读取或写入任何注册表/INI 文件/任何内容。
但是,为了确保模拟对象在被测试类访问时的行为与真实对象完全一样,我的单元测试必须通过非常明确地定义预期的方法调用和被测类预期的返回值来设置模拟对象。这意味着如果我必须更改访问层的接口或测试类使用该层的方式,我还必须更改内部使用该接口的类的单元测试,即使接口我实际上正在测试的课程根本没有改变。这是我在使用模拟时必须忍受的事情,还是有更好的方法来设计可以避免这种情况的类依赖关系?