【问题标题】:How to unit test a code which transforms some files using third party library如何对使用第三方库转换某些文件的代码进行单元测试
【发布时间】: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


【解决方案1】:

测试给定输入产生的输出。然而测试二进制输出(字节)真的很脆弱。因此,请尝试从输出中获得更具可读性的模型。

您可以使用pdfbox 重新分析/解析输出。这提供了一个您可以断言的模型。最好只断言您期望的相关属性,而不是完整的 pdf 结构,因为后者可能几乎和二进制代码一样脆弱。

另外:即使测试一些示例输入的二进制输出也比不测试要好。

【讨论】:

    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多