【发布时间】:2018-01-19 04:53:11
【问题描述】:
我正在使用一些 XSL 样式表对 XML 文件进行转换,并使用 Aache FOP 生成 PDF 文档(详情 here)。参考Java代码sn-p如下:
public byte[] writePdf(String xml, FopFactory fopFactory, Transformer transformer)
StreamSource xmlStream = new StreamSource(new StringReader(xml));
//fop:
try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
Fop fop = fopFactory.newFop(MIME_PDF, out);
Result res = new SAXResult(fop.getDefaultHandler());
transformer.transform(xmlStream, res);
return out.toByteArray();
}
}
Transformer 实例和FopFactory 是从外部注入的。
简而言之,该程序使用“Java XML”和“Apache FOP”API 来编写使用一些 XSL 和 XML 资源的文档。
关于如何对这件作品进行单元测试的任何想法?测试还需要访问 XML 和 XSL 资源是不是很好?
编辑:
什么可以轻松完成:
- 通过提供 Transformer 的模拟实例来测试方法
transform是否已被调用。
有哪些问题要素:
- 验证生成的
byte[]。它是正确的结果还是任何数组? - 在转换过程中是否使用了提供的 xml 字符串?
执行此操作的一种方法是提供来自测试的实际 XML、XSLT 资源,并将输出流与预期进行比较。对我来说,这似乎很脆弱,因为如果底层使用的 API 的输出发生轻微变化,这很容易破坏。此外,这也是不够的,因为它只能测试一个硬编码的测试场景。
所使用的 API 本身是不可测试的还是可以改进的?
【问题讨论】:
-
我拒绝/投票结束这个问题。如果您要求提供有关该问题的更多信息或适当地发表评论,将会很有帮助。
-
单元测试将使用模拟 FopFactory 和 Transformer。
-
@Henry 谢谢。模拟依赖是有意义的。我仍然有一个挑战来验证这个方法对提供的依赖项做了什么。相应地编辑了问题。
标签: unit-testing junit mocking apache-fop