您的位置:首页 > 其它

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

2010-05-23 17:07 429 查看
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接收异常
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: