很多时候,技术面试官会问诸如“打印东西”之类的问题。例如: http://www.geeksforgeeks.org/given-a-binary-tree-print-all-root-to-leaf-paths/
以下代码将要求打印从root到leaf的所有路径。
如何对这样的代码进行单元测试?
一种解决方案是将所有路径返回数据结构。但是面试官会因为消耗巨大的空间复杂性而责备我?
答案 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。在您提供的玩具问题中,我很想采用这种捷径。