您似乎追求相互矛盾的目标。一方面,您试图避免将数据写入磁盘,这在测试中并不是一个坏目标。另一方面,您正在尝试测试I /
O处理类,这意味着您将使用假定您
File将使用本机调用的系统实用程序进行工作。因此,这是我的指导:
- 不要试图嘲笑一个
File
。只是不要。太多的本地事物依赖于此。 - 如果可以的话,请将您的I / O处理代码分成打开a的一半
File
和将其转换为aReader
的一半,以及从中解析HTML的一半Reader
。 - 那时,您根本不需要模拟-只需构造一个
StringReader
即可模拟数据源。 - 尽管这可以很好地处理单元测试,但您可能还需要编写一个使用临时文件并确保其读取正确的 集成测试 。(感谢Brice添加该提示!)
不要害怕重构您的类以简化测试,如下所示:
class YourClass { public int method(File file) { // do everything here, which is why it requires a mock } }class YourRefactoredClass { public int method(File file) { return methodForTest(file.getName(), file.isFile(), file.isAbsolute(), new FileReader(file)); } int methodForTest( String name, boolean isFile, boolean isAbsolute, Reader fileContents) { // actually do the calculation here } }class YourTest { @Test public int methodShouldParseBadHtml() { YourRefactoredClass yrc = new YourRefactoredClass(); assertEquals(42, yrc.methodForTest( "bad.html", true, false, new StringReader(badHTMLText)); } }
在这一点上,逻辑输入
method非常简单,不值得测试,并且逻辑输入
methodForTest非常容易访问,可以对其进行大量测试。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)