java - BufferedReader read() 方法始终为 true

标签 java unit-testing reflection bufferedreader

我正在尝试测试使用 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。所以它进入了无限循环。

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

最佳答案

How can I initialize the reader to avoid this infinite loop?

你不能。

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

一个常见的习语是:

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

ready() 方法的 javadoc 说道:

"Returns: True if the next read() is guaranteed not to block for input, false otherwise."

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

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

<小时/>

Unfortunately, I cannot change the code in the class that has to be tested.

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

关于java - BufferedReader read() 方法始终为 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27899416/

相关文章:

java - 如何使用 ReportNG 在 selenium webdriver 中截取失败测试的屏幕截图

unit-testing - 无法在 Visual Studio 2019 中分析测试

phpunit:为什么这个 assertContains 通过了?

c# - AddEventHandler 使用反射

java - 如何使用可执行jar运行spring计划任务

启动 Play 项目时出现java.lang.UnsatisfiedLinkError

java - 许多 jtable 的 ListSelectionListener

c# - RhinoMocks 错误 "Only assignment, call, increment, decrement, and new object expressions can be used as a statement"

javascript - 为 window.location 附加更改通知程序

c# - 使用 IL 获取结构体的属性值