当前位置: 首页 > 面试题库 >

无法在junit中模拟BufferedWriter类

左丘阳晖
2023-03-14
问题内容

我在源代码中使用了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类?有没有办法模拟它,或者我做错了什么?


问题答案:

,你可以嘲笑的Java
IO类(包括它们的构造,所以未来的情况下,也得到嘲笑)与JMockit库,虽然你可能会面临困境,如NullPointerExceptionWriter()构造函数(取决于嘲讽是怎么做的,以及IO类被嘲笑)。

但是,请注意,Java IO API包含许多交互类和深层继承层次结构。在您的示例中,FileWriter可能还需要模拟该类,否则将创建一个实际文件。

同样,在应用程序代码中使用IO类通常只是实现细节,可以轻松更改。例如,您可以从IO流切换到编写器,从常规IO切换到NIO,或者使用新的Java
8实用程序。或使用第三方IO库。

最重要的是,尝试模拟IO类是一个非常糟糕的主意。如果(如另一个答案中所建议)更改客户端代码以将Writers等 注入
到SUT中,则情况更糟。依赖注入只是不适合这种事情。

而是在本地文件系统中使用 真实 文件,最好是从测试目录中删除 真实
文件,该目录可以在测试后删除,和/或仅在读取时使用固定资源文件。本地文件快速可靠,并导致更有用的测试。某些开发人员会说“如果测试碰到文件系统,则它不是单元测试”,但这只是教条式的建议。



 类似资料:
  • 我有一种方法可以将文件上传到Amazon S3。我正在尝试为此方法编写JUnit,但在S3AsyncClient上获取NullPointerException: 我的班级: S3UploadData类对象的输入:` @Getter@allargsconstuctor 你能帮我写Junit for uploadFile方法吗?

  • 但是对于这个源代码,我不能编写JUnit测试,因为不能模拟类。对于模拟final类,我们可以使用PowerMock,它支持模拟静态和final方法。但在这里,如果我使用PowerMock,它仍然不是嘲弄。我使用的是Spring Framework5.2.1.版本,这个版本的JUnit有没有什么变化来模拟最终类或方法?或者任何一个可以帮助我编写此代码的单元测试(我使用的版本是Spring Frame

  • 我有一个服务我是这样嘲笑的: } 服务: 我需要能够模拟“CloseableHttpResponse Response = http client . execute(request,clientContext)”,这样“response”对象就是我提前创建的。我希望一些嘲讽的when/then构造可以解决这个问题。我会很感激如何做到这一点的想法。谢谢!

  • 我完全被困在java测试中;它是关于通过测试方法将字符'a'发送到JFrame组件的JTextField。 JFrame类实现KeyListener接口,并以此重写KeyPressed、KeyTyped和KeyReleased。同时,我将JTextField的所有按键转移到JFrame;在JFrame构造函数中,我有: 我想测试这种行为,然后模拟JTextField中类型a字符的操作。 我还尝试了

  • 当我尝试用PowerMock和Mockito测试一个方法并模拟它的依赖关系时遇到了问题。我尝试将依赖关系方法转换为非静态方法,并使用@mock注释和@injectmocks,但没有任何结果。 下面是正在测试的类和方法: 这里有一个我想要嘲弄的依赖关系,我很难嘲弄它: 最后,但不是最不重要的是,使用失败的测试方法的测试类。我不得不说,它甚至没有到达assert方法调用,而是在when().ThenR

  • 我使用Spring Initializr生成了一个Spring Bootweb应用程序,使用嵌入式Tomcat+Thymeleaf模板引擎,并将其打包为一个可执行的JAR文件。 类NexTelsMSSender: . 但这似乎并不是在嘲弄对象属性,因为当我打包应用程序时。我有一个错误: