单元测试复杂的方法,测试什么以及假设什么?

时间:2014-01-16 08:31:18

标签: java unit-testing

考虑函数private void create (List<T> items)。此代码基本上创建了一个提供BFS遍历列表的树。现在,假设此代码返回root,我们可以验证它是否创建了树,但是执行遍历和验证遍历是否符合预期。到目前为止一切都很好。

但是:

  1. 由于此功能非常复杂,我们是否应该费心去测试/验证leftIndexrightIndex计算是否准确完成?

  2. 如果是,那么如何测试函数的内部细节?

  3. 一般来说,给定一个复杂的函数,如何测试有助于返回值但却不使用API​​ /函数调用的内部计算?

1 个答案:

答案 0 :(得分:6)

如果你有一个复杂的私有方法,你觉得它可以从单元测试中受益,一个常见的方法是使该方法包私有,这样你就可以直接从单元测试中调用它。在您的情况下,您可能希望将遍历方法包为private,或者为root生成包私有getter方法。

但是作为一般的经验法则,你应该专门测试一个特定类的契约,而不用担心它是如何实现的。也就是说,您应确保根据已知的输入集生成预期输出。假设输出正确,内部结构正常工作。代码覆盖率工具可用于确定您的公共API测试是否运行了足够的私有代码。

对类的内部进行单元测试的愿望可能表明该类已经变得太大并且将从分解为更小,更可测试的类中受益。这些类也可以是包私有的,从而确保您的整体公共API不受影响。