Java 关闭BufferedReader将导致在Junit中关闭流
我有几个JUnit测试,它们都调用同一个类(使用不同的输入),并检查该类的返回值 类本身有一个使用Java 关闭BufferedReader将导致在Junit中关闭流,java,junit,Java,Junit,我有几个JUnit测试,它们都调用同一个类(使用不同的输入),并检查该类的返回值 类本身有一个使用BufferedReader的代码,该代码在读取结束时关闭。 第一个测试通过了,但是在它抛出流之后的每个测试都关闭了 我在每个测试中创建一个新的类实例,在读取的代码中创建一个新的BufferReader 测试不应该包含在内吗?新实例不应该解决此问题吗 我的示例测试(省略了在每个测试中为可读性生成不同参数的代码) 在myClass中,我有以下代码(INPUT_STREAM是我的项目资源中的一个txt文
BufferedReader
的代码,该代码在读取结束时关闭。
第一个测试通过了,但是在它抛出流之后的每个测试都关闭了
我在每个测试中创建一个新的类实例,在读取的代码中创建一个新的BufferReader
测试不应该包含在内吗?新实例不应该解决此问题吗
我的示例测试(省略了在每个测试中为可读性生成不同参数的代码)
在myClass中,我有以下代码(INPUT_STREAM是我的项目资源中的一个txt文件,对于每个测试都是相同的)
___编辑_________
我获取输入流的方式是:
我在班上名列前茅
private static InputStream INPUT_STREAM= initializeInputStream();
private static InputStream initializeInputStream() { InputStream inputStream = System.class.getResourceAsStream("textFile.txt"); return inputStream; }
___结束编辑_____
ReadInputsClass
构造函数正在调用以下代码
private ArrayList<SomeClass> readStream(InputStream inputStream) {
ArrayList<SomeClass> ret = new ArrayList<SomeClass>();
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(inputStream));
String line = br.readLine();
while (line != null) {
// do some stuff on the line just read
line = br.readLine();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return ret;
}
private ArrayList readStream(InputStream-InputStream){
ArrayList ret=新的ArrayList();
BufferedReader br=null;
试一试{
br=新的BufferedReader(新的InputStreamReader(inputStream));
String line=br.readLine();
while(行!=null){
//在线上做些事情,读一读
line=br.readLine();
}
}捕获(IOE异常){
e、 printStackTrace();
}最后{
试一试{
如果(br!=null)
br.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
返回ret;
}
显然,问题来自此代码中的br.close
当我放置一个断点时,第二个测试是获取设置为null的br,创建一个新的br,当它到达br.readLine()时,它将关闭流
我不明白为什么?新的br=new BufferedReader不是应该重新开始吗?您正在代码中嵌套流:
br = new BufferedReader(new InputStreamReader(inputStream));
在Java中,如果关闭最外层的流,则链中的所有其他流也将关闭。这意味着如果调用br.close(),则会调用InputStreamReader上的close()方法,而该方法又会调用inputStream变量上的close方法
如果您将输入_流初始化为静态变量并重新使用它,这意味着使用INPUT\u STREAM变量的后续测试将使用一个已经关闭的流。您需要在每个测试中重新打开INPUT\u流-可能此InputStream是一个单例,并且由第一个BufferedReader关闭
这部分代码不是新的InputStreamReader(InputStream)吗不,不是:这只会围绕相同的inputStream
实例创建一个新的包装器,这也是我传递输入流的方式private static inputStream initializeInputStream(){inputStream inputStream=System.class.getResourceAsStream(“textFile.txt”);return inputStream;}
如何将其传递给ReadInputsClass
?:如果INPUT\u STREAM
是一个存储的变量,请删除它并使用new ReadInputsClass(initializeinputsclass())
而不是如何知道INPUT\u STREAM是一个静态变量?您的回答只是重新表述了其他人在评论中所做的分析,而没有明确知道此假设是否正确。不幸的是,我正在处理的代码全部使用静态(我正在维护的代码,因此删除所有这些静态不是一个选项)重新创建输入流的好方法是什么?我建议@wero在您的问题下面的评论中提到的方法,即使用new ReadInputsClass(initializeInputStream())
创建ReadInputsClass,而不是引用静态输入流变量。
private ArrayList<SomeClass> readStream(InputStream inputStream) {
ArrayList<SomeClass> ret = new ArrayList<SomeClass>();
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(inputStream));
String line = br.readLine();
while (line != null) {
// do some stuff on the line just read
line = br.readLine();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return ret;
}
br = new BufferedReader(new InputStreamReader(inputStream));