如何使用print语句对代码进行单元测试?

时间:2015-02-03 16:49:26

标签: java unit-testing binary-tree

很多时候,技术面试官会问诸如“打印东西”之类的问题。例如: http://www.geeksforgeeks.org/given-a-binary-tree-print-all-root-to-leaf-paths/

以下代码将要求打印从root到leaf的所有路径。

如何对这样的代码进行单元测试?

一种解决方案是将所有路径返回数据结构。但是面试官会因为消耗巨大的空间复杂性而责备我?

2 个答案:

答案 0 :(得分:2)

一种解决方案是将PrintStream传递给您的方法。当您从main拨打电话时,请传递System.out,如下所示:

public static void main(String[] args) {
    Tree tree = ...
    TreePrinter printer = ...
    printer.printTree(System.out);
}

当您从单元测试代码调用该方法时,将其传递给PrintStream的子类,该子类收集内存中的输出,并将其与预期输出进行比较:

@Test
public void testTreePrinter() {
    Tree tree = ...
    TreePrinter printer = ...
    MyTestStream testStream = ...
    printer.printTree(testStream);
    assertEquals(expectedOutput, testStream.collectedOutput());
}

答案 1 :(得分:0)

在一般情况下,隔离难以测试的依赖(如控制台输出)是可行的方法。所以一般来说,我会按照dasblinkenlight的建议做一些事情。这也清楚地分离了计算树的责任并将其打印出来(无论是在计算之后还是在计算过程中),这使得您的代码可以更容易维护。

在System.out非常常见的情况下,有一个替代方案,不需要更改生产代码:you can capture the out stream in a string by using System.setOut。在您提供的玩具问题中,我很想采用这种捷径。