Heim  >  Artikel  >  Warum bestehen meine Java-Servertests, wenn ich vor dem Test eine System.out.println(in.readLine())-Anweisung hinzufüge, aber ohne diese fehlschlagen?

Warum bestehen meine Java-Servertests, wenn ich vor dem Test eine System.out.println(in.readLine())-Anweisung hinzufüge, aber ohne diese fehlschlagen?

王林
王林nach vorne
2024-02-22 13:34:06738Durchsuche

Antwort des

php-Editors Yuzai: Das Hinzufügen der System.out.println(in.readLine())-Anweisung im Java-Servertest kann sich auf die Testergebnisse auswirken, da diese Anweisung den Eingabestream des Servers liest, damit der Server die Anfrage empfangen kann. Ohne diese Anweisung empfängt der Server die Anfrage möglicherweise nicht korrekt, was dazu führt, dass der Test fehlschlägt. Daher dient das Hinzufügen dieser Anweisung vor dem Test dazu, sicherzustellen, dass der Server die Anforderung normal empfangen und den Test bestehen kann.

Frageninhalt

Ich versuche, einen Server in Java zu implementieren, um das Mehrspieler-Minesweeper-Spiel zu verwalten. Beim Versuch, meinen Server zu testen, um sicherzustellen, dass er korrekt auf legitime Client-Anfragen reagiert, habe ich festgestellt, dass nur das Hinzufügen einer system.out.println(in.readline())-Anweisung nach dem Drucken einer bestimmten Client-Anfrage an den Server die Testausgabe bestehen würde stream , aber bevor der Test selbst aufgerufen wird.

Eine Anfrage, die ein Kunde beispielsweise stellen kann, ist eine „Ansicht“-Anfrage, um den aktuellen Status des Boards anzuzeigen. Ich habe ursprünglich einen Test für „look“ so geschrieben:

@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());

Wenn ich den Test jedoch auf diese Weise ausführe, schlägt er fehl und ich erhalte eine Fehlermeldung, die besagt, dass [- - - - - - -] erwartet, aber [] erhalten wurde.

Aber wenn ich eine Print-Anweisung wie diese hinzufüge:

@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());

Test bestanden. Warum gibt es eine solche Situation? Gibt die print-Anweisung dem Client nur mehr Zeit, Eingaben vom Server zu lesen, oder ist möglicherweise noch etwas anderes im Gange? Gerne stelle ich Ihnen weitere Ausschnitte meines Codes zur Verfügung, wenn es Ihnen hilft.

Workaround

Blindes Raten: Ihre Serverantwort beginnt mit einer unerwarteten Leerzeile.

system.out.println(in.readline());<code>println 部分实际上并不重要,只需使用 in.readline() 就会得到相同的结果,因为它“消耗”了来自服务器的第一行。这不是时间问题,因为 readline() blockiert, bis die gesamte Zeile empfangen wurde.

Sie können dies auf dem Server beheben, indem Sie alles entfernen, was leere Zeilen sendet, oder Ihren Test ändern, um das Problem zu beheben:

out.println("look");
    assertEquals("", in.readLine()); // Add this line.
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());
    assertEquals("- - - - - - -", in.readLine());

Das obige ist der detaillierte Inhalt vonWarum bestehen meine Java-Servertests, wenn ich vor dem Test eine System.out.println(in.readLine())-Anweisung hinzufüge, aber ohne diese fehlschlagen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen