【发布时间】:2014-02-17 08:58:36
【问题描述】:
我创建了一个 XML 解析器来解析一些 xml 配置文件。解析器的结果在回调监听器中返回,如下所示:
interface OnParseResultListener {
void onFinished(Result result);
}
而解析器通过传入xml文件路径和监听器来获取Result对象:
MyParser parser = new MyParser();
parser.parse("conf.xml", new OnParseResultListener(){
void onFinished(Result result) {
// get the Result object here
}
});
现在我想编写 JUnit 代码来测试 MyParser 是否运行良好。但是当我把上面的代码放到一个测试方法中时,测试方法总是在onFinished()被调用之前就被终止了。
我尝试在调用parse() 之后使用wait(),并在解析完成时在onFinished() 中使用notify(),但它一直在等待。我的猜测是 JUnit 线程被阻塞了,但是 SAX XMLReader 需要向那个线程发送事件,所以它不会通过。
所以我不能阻塞 JUnit 线程,但它在我的解析完成之前就结束了。我可以做些什么来测试解析结果??
MyParser 大致如下:
public class MyParser {
OnParserResultListener listener;
public void parse(InputStream xml, OnParserResultListener listener) {
this.listener = listener;
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser;
try {
parser = factory.newSAXParser();
XMLReader xmlReader = parser.getXMLReader();
//handle xml parsing events in a customized BaseHandler
xmlReader.setContentHandler(new BaseHandler());
InputSource is = new InputSource(xml);
xmlReader.parse(is);
} catch (Exception e) {}
}
}
class BaseHandler extends DefaultHandler {
public void startElement(String u, String l, String q, Attributes a) {
.... //handle xml tag
}
public void endElement(String r, String l, String q) throws SAXException {
.... //read xml value, save to a Result object
//return the Result object via OnParserResultListener's callback method
this.listener.onFinished(Result);
}
....//other methods
}
【问题讨论】: