无法在 junit 中模拟 BufferedWriter 类

2023-12-10

我在源代码中使用 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 类是一个非常糟糕的主意。如果(如另一个答案中所建议的)您将客户端代码更改为具有更糟糕的结果Writers, etc. injected进入 SUT。依赖注入不适合这种事情。

相反,使用real本地文件系统中的文件,最好来自可以在测试后删除的测试目录,和/或仅在读取时使用固定资源文件。本地文件快速可靠,可以进行更有用的测试。某些开发人员会说“如果涉及文件系统,测试就不是单元测试”,但这只是教条式的建议。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在 junit 中模拟 BufferedWriter 类 的相关文章

随机推荐