Jawapan editor php Yuzai: Menambah pernyataan System.out.println(in.readLine()) dalam ujian pelayan Java boleh menjejaskan keputusan ujian, kerana pernyataan ini akan membaca aliran input pelayan supaya pelayan boleh menerima permintaan. Tanpa kenyataan ini, pelayan mungkin tidak menerima permintaan dengan betul, menyebabkan ujian gagal. Oleh itu, menambah kenyataan ini sebelum ujian adalah untuk memastikan pelayan boleh menerima permintaan secara normal dan lulus ujian.
Saya cuba melaksanakan pelayan di java untuk mengendalikan permainan penyapu ranjau berbilang pemain. Semasa cuba menguji pelayan saya untuk memastikan ia bertindak balas dengan betul kepada permintaan pelanggan yang sah, saya mendapati bahawa hanya menambah pernyataan system.out.println(in.readline()) selepas mencetak permintaan klien tertentu kepada pelayan akan lulus output ujian stream , tetapi sebelum memanggil ujian itu sendiri.
Sebagai contoh, satu permintaan yang boleh dibuat oleh pelanggan ialah permintaan "view" untuk melihat status terkini lembaga tersebut. Saya pada asalnya menulis ujian untuk "rupa" seperti ini:
@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());
Namun, apabila saya menjalankan ujian seperti ini, ia gagal dan saya mendapat mesej ralat yang menyatakan bahawa ia menjangkakan [- - - - - - -] tetapi mendapat [].
Tetapi apabila saya menambah kenyataan cetakan seperti ini:
@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());
Ujian lulus. Kenapa ada keadaan sedemikian? Adakah penyata cetakan hanya memberi pelanggan lebih masa untuk membaca input daripada pelayan, atau adakah mungkin ada perkara lain yang berlaku? Senang dapat memberikan lebih banyak coretan kod saya jika ia membantu.
Teka Buta: Respons pelayan anda bermula dengan baris kosong yang tidak dijangka.
system.out.println(in.readline());<code>println
部分实际上并不重要,只需使用 in.readline()
就会得到相同的结果,因为它“消耗”了来自服务器的第一行。这不是时间问题,因为 readline()
akan menyekat sehingga keseluruhan baris diterima.
Anda boleh membetulkannya pada pelayan dengan mengalih keluar apa sahaja yang menghantar baris kosong atau mengubah suai ujian anda untuk menyelesaikan masalah:
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());
Atas ialah kandungan terperinci Mengapakah ujian pelayan Java saya lulus apabila saya menambah pernyataan System.out.println(in.readLine()) sebelum ujian, tetapi gagal tanpanya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!