【发布时间】:2014-07-04 03:02:09
【问题描述】:
我必须实现一些代码来遍历目录结构并返回找到的文件列表。要求很简单:
- 给定一个基目录,找到其中的所有文件(它们本身不是目录)。
- 如果找到目录,请对其重复步骤 1。
我想使用 TDD 开发代码。当我开始编写测试时,我意识到我在模拟类File,所以我可以拦截对File.isDirectory() 的调用等等。通过这种方式,我强迫自己使用一个我会调用该方法的解决方案。
我不喜欢它,因为这个测试肯定与实现紧密耦合。如果我改变了询问文件是否为目录的方式,那么即使我保持合同工作,这个测试也会失败。由于该帖子中表达的所有原因,将其视为Private Unit Test 让我感到不安。我不确定这是否是我需要使用这种测试的情况之一。另一方面,我真的很想确保它返回每个文件,而不是目录,遍历整个结构。对我来说,这需要一个好的、简单的测试。
我想避免必须在“磁盘上”创建包含真实测试文件的测试目录结构,因为我认为它相当笨拙并且违背了我读过的一些最佳实践。
请记住,我不需要对内容做任何事情,因此使用 StringReader 而不是 FileReader 之类的技巧在这里不适用。不过,我认为我可以做一些等效的事情,比如当我设置测试时能够在内存中创建一个目录结构,然后将其拆除。我还没有找到方法。
您将如何使用 TDD 开发此代码?
谢谢!
【问题讨论】:
-
一个选项是Commons VFS,但通常我只使用“真实”文件访问,并让我的测试使用特殊目录进行测试。
-
@DavidWallace 你应该把它作为答案。
-
谢谢@DavidWallace!我想 Commons VFS 对我的目的来说可能是一种矫枉过正。拥有一个“真实的”文件结构可以简化测试并使其与实现的耦合度大大降低。我试试看!
-
是的,我发现使用真实文件效果很好。虽然有一些陷阱。你真的想给每个测试方法自己的子目录,以消除测试相互交互的可能性。并确保测试在运行之前和之后都清理了自己的目录,以防万一它在之前的测试运行中途终止,并留下一些不需要的文件。
标签: java unit-testing junit tdd