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