Mengolok-olok Metode Pribadi Menggunakan PowerMock

1. Ikhtisar

Salah satu tantangan pengujian unit adalah mengejek metode privat.

Dalam tutorial ini, kita akan belajar tentang bagaimana kita bisa mencapai ini dengan menggunakan pustaka PowerMock - yang didukung oleh JUnit dan TestNG.

PowerMock terintegrasi dengan kerangka kerja tiruan seperti EasyMock dan Mockito dan dimaksudkan untuk menambahkan fungsionalitas tambahan ke dalamnya - seperti mengejek metode pribadi, kelas akhir, dan metode akhir, dll.

Itu dilakukan dengan mengandalkan manipulasi bytecode dan classloader yang sepenuhnya terpisah.

2. Ketergantungan Maven

Pertama, mari tambahkan dependensi yang diperlukan untuk menggunakan PowerMock dengan Mockito dan JUnit ke pom.xml kami :

 org.powermock powermock-module-junit4 1.7.3 test   org.powermock powermock-api-mockito2 1.7.3 test 

Versi terbaru dapat diperiksa di sini dan di sini.

3. Contoh

Mari kita mulai dengan contoh LuckyNumberGenerator. Kelas ini memiliki metode publik tunggal untuk menghasilkan angka keberuntungan:

public int getLuckyNumber(String name) { saveIntoDatabase(name); if (name == null) { return getDefaultLuckyNumber(); } return getComputedLuckyNumber(name.length()); }

4. Variasi dalam Mocking Metode Privat

Untuk pengujian unit metode yang lengkap, kita perlu meniru metode privat.

4.1. Metode Tanpa Argumen tetapi Dengan Nilai Kembali

Sebagai contoh sederhana, mari kita mengejek perilaku metode privat tanpa argumen dan memaksanya untuk mengembalikan nilai yang diinginkan:

LuckyNumberGenerator mock = spy(new LuckyNumberGenerator()); when(mock, "getDefaultLuckyNumber").thenReturn(300); 

Dalam kasus ini, kami memalsukan metode pribadi getDefaultLuckyNumber dan membuatnya mengembalikan nilai 300.

4.2. Metode Dengan Argumen dan Nilai Kembali

Selanjutnya, mari kita tiru perilaku metode privat dengan sebuah argumen dan memaksanya untuk mengembalikan nilai yang diinginkan:

LuckyNumberGenerator mock = spy(new LuckyNumberGenerator()); doReturn(1).when(mock, "getComputedLuckyNumber", ArgumentMatchers.anyInt()); 

Dalam hal ini, kami mengejek metode privat dan membuatnya mengembalikan 1.

Perhatikan bahwa kita tidak peduli dengan argumen input dan menggunakan ArgumentMatchers.anyInt () sebagai karakter pengganti.

4.3. Verifikasi Doa Metode

Strategi terakhir kami adalah menggunakan PowerMock untuk memverifikasi pemanggilan metode pribadi:

LuckyNumberGenerator mock = spy(new LuckyNumberGenerator()); int result = mock.getLuckyNumber("Tyranosorous"); verifyPrivate(mock).invoke("saveIntoDatabase", ArgumentMatchers.anyString()); 

5. Kata Perhatian

Terakhir, meskipun metode privat dapat diuji menggunakan PowerMock, kita harus ekstra hati-hati saat menggunakan teknik ini.

Mengingat tujuan pengujian kami adalah untuk memvalidasi perilaku kelas, kita harus menahan diri dari mengubah perilaku internal kelas selama pengujian unit.

Teknik mengejek harus diterapkan pada dependensi eksternal kelas dan bukan pada kelas itu sendiri.

Jika mengejek metode privat sangat penting untuk menguji kelas kita, itu biasanya menunjukkan desain yang buruk.

6. Kesimpulan

Dalam artikel singkat ini, kami menunjukkan bagaimana PowerMock dapat digunakan untuk memperluas kemampuan Mockito untuk mengejek dan memverifikasi metode privat di kelas yang diuji.

Kode sumber dari tutorial ini dapat ditemukan di GitHub.