junit源码学习--观察者模式

来源:互联网 发布:网络作家真实收入排行 编辑:程序博客网 时间:2024/05/21 07:00

TestResult担任发布者角色,拥有protected List<TestListener> fListeners;担任观察者角色

以下都是TestResult类源码

/**
  * Registers a TestListener观察者注册
  */
 public synchronized void addListener(TestListener listener) {
  fListeners.add(listener);
 }
 /**
  * Unregisters a TestListener观察者移除
  */
 public synchronized void removeListener(TestListener listener) {
  fListeners.remove(listener);
 }

 

/**

  *因为listeners始终指向同一组对象,为了防止线程问题,加上了synchronized标识,每次测试使用一组copy
  * Returns a copy of the listeners.
  */
 private synchronized List<TestListener> cloneListeners() {
  List<TestListener> result= new ArrayList<TestListener>();
  result.addAll(fListeners);
  return result;
 }

 

/**

  *运行testcase
  * Runs a TestCase.
  */
 protected void run(final TestCase test) {
  startTest(test);//通知观察者改变状态
  Protectable p= new Protectable() {
   public void protect() throws Throwable {
    test.runBare();
   }
  };
  runProtected(test, p);

  endTest(test);//通知观察者改变状态
 }

 

/**

  *通知观察者改变状态(测试开始)
  * Informs the result that a test will be started.
  */
 public void startTest(Test test) {
  final int count= test.countTestCases();
  synchronized(this) {
   fRunTests+= count;
  }
  for (TestListener each : cloneListeners())
   each.startTest(test);//每个listener调用startTest方法
 }

 

/**

  *通知观察者改变状态(测试结束)
  * Informs the result that a test was completed.
  */
 public void endTest(Test test) {
  for (TestListener each : cloneListeners())
   each.endTest(test);//每个listener调用startTest方法
 }

 

/**

  *实际运行testcase
  * Runs a TestCase.
  */
 public void runProtected(final Test test, Protectable p) {
  try {
   p.protect();
  }
  catch (AssertionFailedError e) {
   addFailure(test, e);
  }
  catch (ThreadDeath e) { // don't catch ThreadDeath by accident
   throw e;
  }
  catch (Throwable e) {
   addError(test, e);
  }
 }

 

/**

  *在实际运行testcase中出现assert异常,则通知观察者listeners
  * Adds a failure to the list of failures. The passed in exception
  * caused the failure.
  */
 public synchronized void addFailure(Test test, AssertionFailedError t) {
  fFailures.add(new TestFailure(test, t));
  for (TestListener each : cloneListeners())
   each.addFailure(test, t);//每个listener接收assert异常
 }

 

/**

  *在实际运行testcase中出现异常,则通知观察者listeners
  * Adds an error to the list of errors. The passed in exception
  * caused the error.
  */
 public synchronized void addError(Test test, Throwable t) {
  fErrors.add(new TestFailure(test, t));
  for (TestListener each : cloneListeners())
   each.addError(test, t);//每个listener接收异常
 }

原创粉丝点击