时候,技术面试官会问诸如"打印一些东西"之类的问题。例如: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 捕获字符串中的输出流。在你提供的玩具问题中,我很想走这条捷径。