我正在尝试测试使用 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/