BufferedReader ready() 方法始终为 true



我正在尝试测试使用BufferedReader意图的类中的方法:

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();
 }

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

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

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

你不能。

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

一个常见的成语是:

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

ready()方法的javadoc说:

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

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

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


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

您在被测试的类中发现了一个错误! 如果您自己无法修复它,请向可以修复的人报告。 (这就是编写单元测试的重点...

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

while (reader.ready())替换为 ,

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

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

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

最新更新