快速业务通道

诊断Java代码: 进行记录器测试以正确调用方法 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
dMessage() {...} } public class Coordinator extends Thread {    Sender s;    Greeter g;    public Coordinator(Sender _s, Greeter _g) {      this.s = _s;      this.g = _g;    }    public void run() {      g.sayHello();      s.sendFirstMessage();      s.sendSecondMessage();      g.sayGoodbye();    } }

第一个类, Greeter ,负责建立和中断与外部客户端的连接。第二个类, Sender ,负责给客户端发送不同的消息。第三个类, Coordinator ,管理另外两个类的实例,确保它们共同合作同客户端进行通信。

勿庸置疑,按适当的顺序调用这些方法是至关重要的。但是将来的扩展和代码的单元重组可能会不经意间改变方法调用的顺序。例如,另一个开发人员可能将 Greeter 和 Sender 方法的调用移到单独的线程中,使用信号来控制调用它们的顺序。

不管发生什么改变,我们要怎样将测试放在我们的套件,才能保证在任何情况下都能按正确的顺序调用方法呢?与许多单元测试不同,我们不能仅仅调用这些方法并检查结果,因为我们想要检查的,并不是使用其中任何一个方法得出的结果。

记录您的下一伟大的步骤…

解决方法是使用一个特殊类型的侦听器,我们称之为 Recorder (记录器)。记录器保存它们所注册的每个对象上的每个方法调用。

记录器按方法被调用的顺序线性地保存这些记录,这非常象一个盒式磁带。通过将相同的 Recorder 安装到每一个对象中,可以检查这些对象中方法的调用顺序。请考虑下面的代码:

诊断Java代码: 进行记录器测试以正确调用方法(3)

时间:2011-02-11 IBM Eric E. Allen

清单 2. 在每个对象中安装相同的 Recorder

public class Recorder {    private StringBuffer tape;    public Recorder() {      this.tape = new StringBuffer();    }    public String playBack() {      return tape.toString();    }    public void record(String s) {      tape.append(s);    } } public class Greeter {    private Recorder r;    public Greeter(Recorder _r) {      this.r = _r;    }    public void sayHello() {      r.record("sayHello();");      ...    }    public void sayGoodbye() {      r.record("sayGoodbye();");      ...    } } public class Sender {    private Recorder r;    public Sender(Recorder _r) {      this.r = _r;    }    public void sendFirstMessage() {      r.record("sendFirstMessage();");      ...    }    public void sendSecondMessage() {      r.record("sendSecondMessage();");      ...    } }

用 String 还是 ToString

注意 Sender 和 Greeter 中的每一个方法必须向 Recorder 通报新方法的调用。在这种方法下,记录器就像其他侦听器一样:任何改变发生时都必须通知它们。

另外,注意被传送到 Recorder 的消息是一个简单的 String 。使用 String 消息有利也有弊。一方面,一个较复杂的对象在每一种方法调用时都能被保存下来,提供更详细的信息。另一方面,这么复杂的对象将使得测试工作更加困难。

诊断Java代码: 进行记录器测试以正确调用方法(4)

时间:2011-02-11 IBM Eric E. Allen

例如,使用清单 2 中的记录器,只要把下面简单的测试加到我们的套件中,就能决定调用的顺序:

清单 3. 一个 JUnit 测试

public void testOrderOfInvocation() throws InterruptedException {    Recorder r = new Recorder();    Greeter

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号