追求代码质量: 探究 XMLUnit
2009-11-19 00:00:00 来源:WEB开发网委托而非继承
首要原则是尽量避免测试用例继承。许多 JUnit 扩展框架,包括 XMLUnit,都提供可以通过继承得到的专门的测试用例来协助测试某一特定的架构。从框架继承来的测试用例都缺乏灵活性,这是 Java 平台的单一继承的范型所致。更多的时候,这些相同的 JUnit 扩展框架提供一个委托 API,此 API 可以更易于组合不同的框架,而无需采用严格的继承结构。
验证内容
可以通过委托或继承的方式使用 XMLUnit。作为最佳策略,我建议避免测试用例继承。另一方面,从 XMLUnit 的 XMLTestCase 继承确实可以提供一些方便的声明方法(这些方法不是静态 的,因而也就不能像 JUnit的 TestCase 声明一样被静态引用)。
不管您如何选择使用 XMLUnit,都必须实例化 XMLUnit 的解析器。您可以通过 System.setProperty 调用实例化它们,也可以通过 XMLUnit 核心类上的一些方便的 static 方法对它们进行实例化。
一旦用所需要的不同的解析器实例化 XMLUnit 之后,就可以使用 Diff 类,这是从逻辑上对比两个 XML 文档所需的中心机制。在清单 3 中,我利用 XMLUnit 对 >testToXML test 做了一些改进:
清单 3. 改进后的 testToXML 测试
public class XMLReportTest extends TestCase {
protected void setUp() throws Exception {
XMLUnit.setControlParser(
"org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
XMLUnit.setTestParser(
"org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
XMLUnit.setSAXParserFactory(
"org.apache.xerces.jaxp.SAXParserFactoryImpl");
XMLUnit.setIgnoreWhitespace(true);
}
private Filter[] getFilters(){
Filter[] fltrs = new Filter[2];
fltrs[0] = new RegexPackageFilter("java|org");
fltrs[1] = new SimplePackageFilter("net.");
return fltrs;
}
private Dependency[] getDependencies(){
Dependency[] deps = new Dependency[2];
deps[0] = new Dependency("com.acme.resource.Configuration");
deps[1] = new Dependency("com.acme.xml.Document");
return deps;
}
public void testToXML() {
BatchDependencyXMLReport report =
new BatchDependencyXMLReport(new Date(1165203021718L),
this.getFilters());
report.addTargetAndDependencies(
"com.acme.web.Widget", this.getDependencies());
report.addTargetAndDependencies(
"com.acme.web.Account", this.getDependencies());
Diff diff = new Diff(new FileReader(
new File("./test/conf/report-control.xml")),
new StringReader(report.toXML()));
assertTrue("XML was not identical", diff.identical());
}
}
更多精彩
赞助商链接