在测试方法本身 testRunServiceAndReturnFalse()
之内,您可以看到更多更改。模拟 Collaborator
对象的 executeJob()
方法将被调用。在此阶段,模拟对象处于记录状态 —— 即简单地定义对象将一直期望的方法调用,因此,模拟将相应地记录期望。下一行是对模拟对象的通知,用于确保当它遇到 executeJob()
方法时,它应当返回字符串 failure。因此,使用 RMock,您只需通过调用方法而不调用模拟对象(并传递它可能需要的任何参数)来描述期望,然后修改该期望以相应地调整任何返回类型。
最后,调用 RMock 方法 startVerification()
把模拟 Collaborator
对象转为就绪状态。模拟对象现已准备好在 ServiceClass
类中作为实际对象使用。该方法非常重要并且必须调用它才能避免测试初始化失败。
再次重新运行 ServiceClassTest
以达到最终的肯定结果:在模拟对象实例化期间提供的参数造成了所有差别。图 6 显示 JUnit 测试已经通过。
图 6. 使用 RMock 的场景 3 测试成功
assertFalse(result)
代码行表示与场景 1 相同的测试期望,而 RMock 像 jMock 以前那样维持测试成功。在许多方面,这都十分重要,但是这里更重要的特点可能是实践了修正失败测试的灵活 原则而不更改测试期望。惟一的差别是使用了另一个框架。
在下一个场景中,您将在一种特殊情况下使用 jMock 和 RMock。没有一个框架能够仅凭自身就实现正确结果,除非在测试内形成某种联合。
如前所述,我希望检验两个框架必须协同工作才能实现某个结果的情况。否则,构建良好的测试每次都将失败。在某些情况下,使用 jMock 还是 RMock 并不重要,例如,当需要模拟的接口或类存在于已经签名的 JAR 中时。此类情况十分少见,但是当测试针对安全专有的产品(通常是这样或那样的一类现有软件)中的应用程序编程接口 (API) 编写代码时可能会出现此情况。
清单 10 显示了两个框架完成测试用例的示例。
文章来源于领测软件测试网 https://www.ltesting.net/