0

好的,我有这个代码:

public void TraverseTree(TreeNode node) {

            TraverseTree(node.getLeftChild());
            System.out.println(node.getKey());
            TraverseTree(node.getRightChild());         
    }

这实际上遍历树的节点并打印它们。我正要写一个测试用例时突然想到如何对没有返回类型的函数进行单元测试?

在更改代码使其值得“单元测试”之后,它看起来像这样:

public ArrayList<Object> TraverseTree(TreeNode node, ArrayList<Object> array) {

                if(array == null)
                      array = new ArrayList<Object>();
                traverseTree(node.getLeftChild(), array);
                array.add(node.getKey())
                traverseTree(node.getRightChild(), array); 

return array;       
        }

现在我在想,这是正确的方法吗?对于每次递归调用,都有一个 ArrayList 对象被推上堆栈这一事实又如何呢?这是一个好方法吗?如果树包含数千个键怎么办?

我真的很想知道有没有更好的方法来做到这一点?是否可以对我的第一个代码示例(不返回任何内容的代码示例)进行单元测试?我的测试用例只是 1)它是否以正确的顺序返回?如果树为空会发生什么?ETC

4

3 回答 3

1

它只是一个被压入堆栈的引用(基本上是一个指针)。

另一种策略是将抽象 Stream 对象传递到您的方法中,然后将其打印到该方法中,而不是将其硬编码为System.out. 然后为了测试,你可以传入一个模拟对象来捕获输出。

于 2013-01-15T16:48:32.510 回答
1

您可以传递要使用的 PrintStream 而不是打印到控制台。这可以是System.out包装了 ByteArrayOutputStream 的 PrintStream,您可以将其转换为 String 以在方法运行后进行检查。

于 2013-01-15T16:54:40.553 回答
0

我想问题是,你的应用程序的主要目的是什么,你想测试什么?
实际上,您的代码除了打印出所有节点之外什么都不做,但我想这只是为了使示例更简单。

我不会测试遍历本身。这是一个给定的系统功能,你可以确定它工作正常。而是测试您的遍历结果。

于 2013-01-15T16:50:51.110 回答