我正在尝试在使用BufferedReader intance的类中测试一个方法:
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();
}
它进入方法,我可以看到reader对象已初始化,但在询问ready()时它总是返回true。所以它进入了一个无限循环。
如何初始化阅读器以避免这种无限循环?
答案 0 :(得分:3)
如何初始化阅读器以避免这种无限循环?
你不能。
您必须测试readLine()
方法的结果。当你到达流的末尾时,它将返回null
。
一个常见的习语是:
String line;
while ((line = reader.readLine()) != null) {
// process line
}
ready()
方法的javadoc说:
"返回:如果保证下一个read()不阻止输入,则返回true,否则返回false。"
由于流位置末尾的readLine()
保证会立即返回,因此ready()
必须返回true
。
如果仔细考虑与ready()
方法相关的所有警告,很明显很难以正确,高效和有用的方式使用该方法。我建议你完全避免它。如果您需要避免输入阻塞,请在非阻塞模式下使用NIO选择器或NIO通道。
不幸的是,我无法更改必须测试的类中的代码。
您已在测试类中找到了BUG!如果您无法自行修复,请将其报告给可以的人。 (这是编写单元测试的重点......)
答案 1 :(得分:0)
你为什么要使用ready()
?您应该使用readLine()
并在返回null
时停止。
答案 2 :(得分:0)
将while (reader.ready())
替换为
String line = null;
do{
line = reader.readLine();
}while (line!= null);
答案 3 :(得分:0)
而不是ready(),你可以尝试
while ((nextLine = in.readLine()) != null)