Java BufferedReader ready()方法始终为true

Java BufferedReader ready()方法始终为true,java,unit-testing,reflection,bufferedreader,Java,Unit Testing,Reflection,Bufferedreader,我尝试在使用BufferedReader intance的类中测试一个方法: public class ClassTotest { private BufferedReader reader; public boolean methodToTest(){ while (reader.ready()){ reader.readLine(); } more code } } 在我的测试类中,我使用反射初始化了reader实例: class MyTest{ @Test

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

public class ClassTotest {
  private BufferedReader reader;

public boolean methodToTest(){
  while (reader.ready()){
     reader.readLine();
  }
  more code
}
}
在我的测试类中,我使用反射初始化了reader实例:

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对象已初始化,但当询问if ready()时,它总是返回true。所以它进入了一个无限循环


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

为什么要使用
ready()
?您应该使用
readLine()
,当它返回
null

时停止,为什么要使用
ready()
?您应该使用
readLine()
,当它返回
null

时停止,为什么要使用
ready()
?您应该使用
readLine()
,当它返回
null

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

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

你不能

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

一个常见的成语是:

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

ready()
方法的javadoc说明:

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

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

如果仔细考虑与Read()/Cux>方法相关的所有警告,很明显,以正确、高效和有用的方式使用该方法是困难的。我建议你干脆避开它。如果您需要避免输入阻塞,那么在非阻塞模式下使用NIO选择器或NIO通道



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

您已经在测试的类中识别出一个BUG!如果你自己不能解决问题,那么就向有能力的人报告。(这就是编写单元测试的要点…)

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

你不能

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

一个常见的成语是:

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

ready()
方法的javadoc说明:

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

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

如果仔细考虑与Read()/Cux>方法相关的所有警告,很明显,以正确、高效和有用的方式使用该方法是困难的。我建议你干脆避开它。如果您需要避免输入阻塞,那么在非阻塞模式下使用NIO选择器或NIO通道



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

您已经在测试的类中识别出一个BUG!如果你自己不能解决问题,那么就向有能力的人报告。(这就是编写单元测试的要点…)

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

你不能

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

一个常见的成语是:

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

ready()
方法的javadoc说明:

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

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

如果仔细考虑与Read()/Cux>方法相关的所有警告,很明显,以正确、高效和有用的方式使用该方法是困难的。我建议你干脆避开它。如果您需要避免输入阻塞,那么在非阻塞模式下使用NIO选择器或NIO通道



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

您已经在测试的类中识别出一个BUG!如果你自己不能解决问题,那么就向有能力的人报告。(这就是编写单元测试的要点…)

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

你不能

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

一个常见的成语是:

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

ready()
方法的javadoc说明:

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

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

如果仔细考虑与Read()/Cux>方法相关的所有警告,很明显,以正确、高效和有用的方式使用该方法是困难的。我建议你干脆避开它。如果您需要避免输入阻塞,那么在非阻塞模式下使用NIO选择器或NIO通道



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

您已经在测试的类中识别出一个BUG!如果你自己不能解决问题,那么就向有能力的人报告。(这就是编写单元测试的要点…)

替换您的
,而(reader.ready())

String line = null;
do{
 line = reader.readLine();
}while (line!= null);
在(reader.ready())时将您的
替换为

String line = null;
do{
 line = reader.readLine();
}while (line!= null);
在(reader.ready())
时将您的
替换为

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