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