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

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接收异常
 }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值