Mock inputStream.readLine()时如何跳出while循环?
解决Mock
readLine()导致无限循环的问题 这个坑我之前踩过!你的while循环逻辑是靠readLine()返回null来终止的,但现在你Mock它每次都返回非null字符串,循环自然停不下来啦。
核心解决方案:控制Mock的返回序列,最后返回null
不管你用的是Mockito还是其他Mock框架,核心思路都是让readLine()在指定次数返回字符串后,最后返回null触发循环终止。
举个Mockito的例子:
// 假设你Mock的是BufferedReader(注意:InputStream本身没有readLine方法,通常是用BufferedReader包装) BufferedReader mockInputStream = Mockito.mock(BufferedReader.class); // 让它先返回2次测试字符串,第3次返回null Mockito.when(mockInputStream.readLine()) .thenReturn("测试内容1") .thenReturn("测试内容2") .thenReturn(null); // 或者更简洁的写法 Mockito.when(mockInputStream.readLine()).thenReturn("测试内容1", "测试内容2", null);
完整测试用例示例
import org.junit.jupiter.api.Test; import org.mockito.Mockito; import java.io.BufferedReader; import java.io.IOException; class YourTestClass { @Test void testLoopTermination() throws IOException { // 1. 创建Mock对象 BufferedReader mockReader = Mockito.mock(BufferedReader.class); // 2. 设置返回序列:2行内容 + null Mockito.when(mockReader.readLine()).thenReturn("第一行数据", "第二行数据", null); // 3. 调用包含循环的目标方法 YourService service = new YourService(); service.processInput(mockReader); // 4. 验证readLine被调用了3次(2次非null + 1次null) Mockito.verify(mockReader, Mockito.times(3)).readLine(); } }
额外提醒
注意:InputStream类本身并没有readLine()方法,你代码里的inputStream大概率是BufferedReader(或者其他带readLine的字符流类),Mock的时候一定要对应正确的类型,不然会出现方法找不到或者类型转换的问题。
内容的提问来源于stack exchange,提问作者RITESH GUPTA
相关产品推荐
相关产品推荐

