BufferedReader ready()方法始终为true

时间:2015-01-12 10:04:17

标签: java unit-testing reflection bufferedreader

我正在尝试在使用BufferedReader intance的类中测试一个方法:

public class ClassTotest {
  private BufferedReader reader;

public boolean methodToTest(){
  while (reader.ready()){
     reader.readLine();
  }
  more code
}
}

在我的测试类中,我使用反射初始化了阅读器实例:

class MyTest{
 @Test
 public void test(){
   ClassTotest testClass = new ClassTotest();
   Field reader = ClassTotest.class
            .getDeclaredField("reader");
   reader.setAccessible(true);
   StringReader stringReader = new StringReader("testString");
   BufferedReader readerToSet = new BufferedReader(stringReader);
   reader.set(testClass, readerToSet);
   testClass.methodToTest();
 }

它进入方法,我可以看到reader对象已初始化,但在询问ready()时它总是返回true。所以它进入了一个无限循环。

如何初始化阅读器以避免这种无限循环?

4 个答案:

答案 0 :(得分:3)

  

如何初始化阅读器以避免这种无限循环?

你不能。

您必须测试readLine()方法的结果。当你到达流的末尾时,它将返回null

一个常见的习语是:

String line;
while ((line = reader.readLine()) != null) {
    // process line
}

ready()方法的javadoc说:

  

"返回:如果保证下一个read()不阻止输入,则返回true,否则返回false。"

由于流位置末尾的readLine()保证会立即返回,因此ready() 必须返回true

如果仔细考虑与ready()方法相关的所有警告,很明显很难以正确,高效和有用的方式使用该方法。我建议你完全避免它。如果您需要避免输入阻塞,请在非阻塞模式下使用NIO选择器或NIO通道。


  

不幸的是,我无法更改必须测试的类中的代码。

您已在测试类中找到了BUG!如果您无法自行修复,请将其报告给可以的人。 (这是编写单元测试的重点......)

答案 1 :(得分:0)

你为什么要使用ready()?您应该使用readLine()并在返回null时停止。

答案 2 :(得分:0)

while (reader.ready())替换为

String line = null;
do{
 line = reader.readLine();
}while (line!= null);

答案 3 :(得分:0)

而不是ready(),你可以尝试

while ((nextLine = in.readLine()) != null)