您的位置:软件测试 > 开源软件测试 > 开源单元测试工具 > junit
JUNIT源码探秘系列(下)
作者:网络转载 发布时间:[ 2013/4/16 14:34:04 ] 推荐标签:

接着我们看下Junit中观察者的实现类是如何实现接口类,在swt、swing的UI方式和控制台方式这三种运行模式中都对其观察者接口的具体实现。在这以testui运行模式调用为例。在testui模式中,TestRunner继承BaseTestRunner而这段代码在BaseTestRunner实现如下:

public synchronized void endTest(Test test) {

      testEnded(test.toString());

   }

   public synchronized void addError(final Test test, final Throwable t) {

      testFailed(TestRunListener.STATUS_ERROR, test, t);

   }

   public synchronized void addFailure(final Test test, final AssertionFailedError t) {

      testFailed(TestRunListener.STATUS_FAILURE, test, t);

}

另外在testui中的ResultPrinter也实现了对TestListener的实现,具体如下:

    public void addError(Test test, Throwable t) {

     getWriter().print("E");

  }

  public void addFailure(Test test, AssertionFailedError t) {

     getWriter().print("F");

  }

  public void endTest(Test test) {

  }

  public void startTest(Test test) {

     getWriter().print(".");

     if (fColumn++ >= 40) {

        getWriter().println();

        fColumn= 0;

     }

}

Junit中的说被观察者是TestResult对象,它有添加观察者的方法:

  public synchronized voidaddListener(TestListener listener) {

     fListeners.addElement(listener);

  }

在Junit中被观察者是如何通知观察者呢?请看这几个方法,在TestResult中下面几个方法都是循环遍历观察者列表,并调用相应的更新方法:

  public synchronized void addError(Test test, Throwable t) {

     fErrors.addElement(new TestFailure(test, t));

     for (Enumeration e= cloneListeners().elements(); e.hasMoreElements(); ) {

        ((TestListener)e.nextElement()).addError(test, t);

     }

  }

  public synchronized void addFailure(Test test, AssertionFailedError t) {

     fFailures.addElement(new TestFailure(test, t));

     for (Enumeration e= cloneListeners().elements(); e.hasMoreElements(); ) {

        ((TestListener)e.nextElement()).addFailure(test, t);

     }

  }

  public synchronized voidaddListener(TestListener listener) {

     fListeners.addElement(listener);

  }

  public synchronized voidremoveListener(TestListener listener) {

     fListeners.removeElement(listener);

  }

  private synchronized Vector cloneListeners() {

     return (Vector)fListeners.clone();

  }

在Junit中使用观察者模式带来的好处:

1)上面提到的Subject与Observer的抽象耦合,使JUnit可以支持不同的使用方式,为Junit执行平台(如textui、awtextui等)的扩展非常容易

2)支持了广播通信,目标对象不关心有多少对象对自己注册,它只是通知注册的观察者

上一页1234567下一页
软件测试工具 | 联系我们 | 投诉建议 | 诚聘英才 | 申请使用列表 | 网站地图
沪ICP备07036474 2003-2017 版权所有 上海泽众软件科技有限公司 Shanghai ZeZhong Software Co.,Ltd