1

我有一个带有 InputStream 捕获的单元测试。像这样的东西:

Capture<InputStream> capturedArgument = new Capture<InputStream>();
// some expectations and the tested method execution here
InputStream actualStream = capturedArgument.getValue();
// some assertions here

实际流(在测试中捕获)在测试对象中关闭。我应该在单元测试中的断言之后手动关闭 actualStream 吗?还是在实际关闭流后也会关闭?

谢谢你。

4

2 回答 2

0

它最终会自行关闭,毕竟大多数 finalize 方法都会调用 close 方法。仍然最好手动进行,因为没有保证垃圾收集器何时会调用 finalize。

于 2013-07-02T14:21:04.993 回答
0

关闭资源始终是一个不错的决定,以使它们可用于其他线程并避免泄漏,但这是一个测试,无论如何,jvm 将在测试后关闭,因此它已完成,您可以保持原样以保持测试很小。

特别是在这种情况下,它已经关闭,因为您提到将在应用程序本身中调用 close 方法。所以捕获里面的Stream也关闭了。

我猜你有以下调用层次结构:

在junittest中

  • 呼叫业务代码

在业务代码中进行测试

  • 打开流
  • 调用方法(输入流)

捕获对象中的junitcode

  • 从捕获中获取价值
  • 断言某事

回到业务代码

  • 在 finally 内关闭流

代码

  • 测试结束

流已关闭

顺便说一句,如果您尝试多次关闭它,您应该在 IOException 中收到一条已经关闭的消息,所以您可以尝试两种方式,对吧?

于 2013-07-02T14:36:23.153 回答