You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Java服务器测试添加System.out.println(in.readLine())才通过?

Java多人扫雷服务器测试的异常问题

我正在开发一款处理多人扫雷游戏的Java服务器,测试服务器对合法客户端请求的响应时发现一个诡异现象:只有在向输出流发送特定客户端请求后、执行测试断言前添加System.out.println(in.readLine())语句,测试才能通过。

场景复现

客户端发送look请求查看棋盘状态,最初的测试代码如下:

@Test(timeout = 10000)
public void publishedTest() throws IOException {

    Thread thread = startMinesweeperServer("board5");

    Socket socket = connectToMinesweeperServer(thread);
    
    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

    out.println("look");
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
}

运行该测试时失败,提示预期[- - - - - - -]但得到[]。

而添加打印语句后,测试即可通过:

@Test(timeout = 10000)
public void publishedTest() throws IOException {

    Thread thread = startMinesweeperServer("board5");

    Socket socket = connectToMinesweeperServer(thread);

    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

    out.println("look");
    System.out.println(in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
}

问题原因分析

核心原因不是打印语句给了客户端更多读取时间,而是服务器在响应look请求时,会先返回一行额外的响应内容(比如状态确认、提示信息),你最初的测试直接读取棋盘行,第一个in.readLine()拿到的是这行额外内容,而非棋盘第一行,导致断言失败。

添加System.out.println(in.readLine())后,相当于先把这行额外内容消费掉了,后续的readLine()才正好对应7行棋盘数据,因此测试通过。

你可以查看打印语句输出的内容,大概率是类似OK、Board status:这类非棋盘的响应信息。

内容的提问来源于stack exchange,提问作者Coder1913

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 02:55:58