我在源代码中使用 BufferedWriter 对象
BufferedWriter outputToErrorFile = new BufferedWriter(new FileWriter(file));
outputToErrorFile.append("some string");
我试图在我的测试用例中模拟它,如下所示:
BufferedWriter mockBufferedWriter = PowerMockito.mock(BufferedWriter.class);
PowerMockito.whenNew(BufferedWriter.class).withAnyArguments().thenReturn(mockBufferedWriter);
PowerMockito.when(mockBufferedWriter.append(Mockito.any(String.class))).thenThrow(new IOException());
然而,BufferedWriter 不会被模拟,它总是进入实际的实现。是因为它是一个具体的类,所以不能模拟 BufferedWriter 吗?这是否意味着 java.io 类都不能被模拟?有没有办法嘲笑它,或者我做错了什么?
您可以使用 JMockit 库模拟 Java IO 类(包括它们的构造函数,因此将来的实例也会被模拟),尽管您可能会遇到诸如NullPointerException
来自Writer()
构造函数(取决于模拟的方式以及模拟了哪些 IO 类)。
但是,请注意,Java IO API 包含许多交互类和深层继承层次结构。在你的例子中,FileWriter
类可能还需要被模拟,否则将创建一个实际的文件。
此外,应用程序代码中 IO 类的使用通常只是一个实现细节,可以轻松更改。例如,您可以从 IO 流切换到写入器,从常规 IO 切换到 NIO,或者使用新的 Java 8 实用程序。或者使用第三方IO库。
最重要的是,尝试模拟 IO 类是一个非常糟糕的主意。如果(如另一个答案中所建议的)您将客户端代码更改为具有更糟糕的结果Writer
s, etc. injected进入 SUT。依赖注入不适合这种事情。
相反,使用real本地文件系统中的文件,最好来自可以在测试后删除的测试目录,和/或仅在读取时使用固定资源文件。本地文件快速可靠,可以进行更有用的测试。某些开发人员会说“如果涉及文件系统,测试就不是单元测试”,但这只是教条式的建议。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)