【问题标题】:BufferedReader ready() method always trueBufferedReader ready() 方法始终为真
【发布时间】:2015-01-12 10:04:16
【问题描述】:

我正在尝试测试一个使用 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();
 }

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

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

【问题讨论】:

  • 很遗憾,我无法更改必须测试的类中的代码。

标签: java unit-testing reflection bufferedreader


【解决方案1】:

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

你不能。

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

一个常见的成语是:

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

ready() 方法的 javadoc 说:

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

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

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


很遗憾,我无法更改必须测试的类中的代码。

您在被测类中发现了一个 BUG!如果您自己无法解决问题,请向可以解决的人报告。 (这就是编写单元测试的重点......)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      将您的 while (reader.ready()) 替换为 ,

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

      【讨论】:

        【解决方案4】:

        您可以尝试使用而不是 ready()

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-02-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-23
          • 2015-12-05
          • 2019-02-01
          相关资源
          最近更新 更多