Pengujian Unit System.out.println () dengan JUnit

1. Ikhtisar

Saat pengujian unit kami terkadang ingin menguji pesan yang kami tulis ke output standar melalui System.out.println () .

Meskipun kami biasanya lebih memilih kerangka kerja logging daripada interaksi langsung dengan keluaran standar, terkadang hal ini tidak memungkinkan.

Dalam tutorial singkat ini, kita akan melihat beberapa cara kita dapat menguji unit System.out.println () menggunakan JUnit.

2. Metode Cetak Sederhana

Sepanjang tutorial ini, fokus pengujian kami adalah metode sederhana yang menulis ke aliran keluaran standar:

private void print(String output) { System.out.println(output); } 

Pengingat cepat bahwa variabel keluar adalah objek PrintStream akhir statis publik yang mewakili aliran keluaran standar yang dimaksudkan untuk penggunaan di seluruh sistem.

3. Bekerja Dengan Core Java

Sekarang mari kita lihat bagaimana kita dapat menulis tes unit untuk memeriksa konten dari apa yang kita kirim ke metode println . Namun, sebelum kita menulis unit test kita yang sebenarnya, kita perlu memberikan beberapa inisialisasi dalam pengujian kita:

private final PrintStream standardOut = System.out; private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); @BeforeEach public void setUp() { System.setOut(new PrintStream(outputStreamCaptor)); }

Dalam metode setUp , kami menetapkan kembali aliran keluaran standar ke PrintStream baru dengan ByteArrayOutputStream . Karena kita akan melihat arus keluaran ini adalah tempat nilai sekarang akan dicetak:

@Test void givenSystemOutRedirection_whenInvokePrintln_thenOutputCaptorSuccess() { print("Hello Baeldung Readers!!"); Assert.assertEquals("Hello Baeldung Readers!!", outputStreamCaptor.toString() .trim()); }

Setelah kita memanggil metode cetak dengan teks yang dipilih, kita kemudian dapat memverifikasi bahwa outputStreamCaptor berisi konten yang kita harapkan. Kami memanggil metode trim untuk menghapus baris baru yang ditambahkan System.out.println () .

Karena aliran keluaran standar adalah sumber daya statis bersama yang digunakan oleh bagian lain dari sistem, kita harus berhati-hati saat memulihkannya ke keadaan semula ketika pengujian kita berakhir:

@AfterEach public void tearDown() { System.setOut(standardOut); }

Ini memastikan kami tidak mendapatkan efek samping yang tidak diinginkan di kemudian hari dalam tes lain.

4. Menggunakan Aturan Sistem

Di bagian ini, kita akan melihat pustaka eksternal rapi yang disebut Aturan Sistem yang menyediakan sekumpulan aturan JUnit untuk menguji kode yang menggunakan kelas Sistem .

Mari kita mulai dengan menambahkan ketergantungan ke pom.xml kita :

 com.github.stefanbirkner system-rules 1.19.0 test 

Sekarang, kita dapat melanjutkan dan menulis pengujian menggunakan SystemOutRule yang disediakan pustaka:

@Rule public final SystemOutRule systemOutRule = new SystemOutRule().enableLog(); @Test public void givenSystemOutRule_whenInvokePrintln_thenLogSuccess() { print("Hello Baeldung Readers!!"); Assert.assertEquals("Hello Baeldung Readers!!", systemOutRule.getLog() .trim()); }

Sangat keren! Dengan menggunakan SystemOutRule, kita dapat menghentikan penulisan ke System.out . Pertama, kami mulai mencatat semua yang ditulis ke System.out dengan memanggil metode enableLog di aturan kami. Kemudian kita cukup memanggil getLog untuk mendapatkan teks yang ditulis ke System.out karena kita memanggil enableLog .

Aturan ini juga menyertakan metode praktis yang mengembalikan log yang selalu memiliki pemisah baris sebagai \ n

Assert.assertEquals("Hello Baeldung Readers!!\n", systemOutRule.getLogWithNormalizedLineSeparator());

5. Menggunakan Aturan Sistem dengan JUnit5 dan Lambdas

Di JUnit5, model aturan diganti dengan ekstensi. Untungnya, pustaka Aturan Sistem yang disajikan di bagian terakhir memiliki variasi yang disiapkan untuk bekerja dengan JUnit5.

Sistem Lambda tersedia dari Maven Central. Jadi kita bisa melanjutkan dan menambahkannya ke pom.xml kita :

 com.github.stefanbirkner system-lambda 1.0.0 test 

Sekarang mari kita terapkan pengujian kita menggunakan versi pustaka ini:

@Test void givenTapSystemOut_whenInvokePrintln_thenOutputIsReturnedSuccessfully() throws Exception { String text = tapSystemOut(() -> { print("Hello Baeldung Readers!!"); }); Assert.assertEquals("Hello Baeldung Readers!!", text.trim()); }

Dalam versi ini, kami menggunakan metode tapSystemOut , yang menjalankan pernyataan dan memungkinkan kami menangkap konten yang diteruskan ke System.out .

6. Kesimpulan

Dalam tutorial ini, kita telah belajar tentang beberapa pendekatan untuk menguji System.out.println . Pada pendekatan pertama, kami melihat cara mengarahkan ulang tempat kami menulis aliran keluaran standar menggunakan Java inti.

Kemudian kami melihat bagaimana menggunakan pustaka eksternal yang menjanjikan yang disebut Aturan Sistem menggunakan, pertama, aturan gaya JUnit 4 dan kemudian bekerja dengan lambda.

Seperti biasa, kode sumber lengkap artikel tersedia di GitHub.