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


很多

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

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

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

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

一种解决方案是将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());
}

在一般情况下,隔离难以测试的依赖项(如控制台输出)是要走的路。所以总的来说,我会按照达斯布林肯莱特的建议做一些事情。这也干净地分离了计算树和打印树(无论是在计算之后还是在计算过程中)的职责,这使得你的代码可以说更易于维护。

在 System.out 的非常常见的情况下,有一种不需要更改生产代码的替代方法:您可以使用 System.setOut 捕获字符串中的输出流。在你提供的玩具问题中,我很想走这条捷径。

最新更新