Mengejek Kaedah Swasta Menggunakan PowerMock

1. Gambaran keseluruhan

Salah satu cabaran pengujian unit adalah mengejek kaedah peribadi.

Dalam tutorial ini, kita akan mengetahui bagaimana kita dapat mencapainya dengan menggunakan perpustakaan PowerMock - yang disokong oleh JUnit dan TestNG.

PowerMock berintegrasi dengan kerangka mengejek seperti EasyMock dan Mockito dan bertujuan untuk menambahkan fungsi tambahan untuk ini - seperti kaedah peribadi mengejek, kelas akhir, dan kaedah akhir, dll.

Ia melakukannya dengan bergantung pada manipulasi bytecode dan pemuat kelas yang sama sekali terpisah.

2. Pergantungan Maven

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

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

Versi terkini boleh diperiksa di sini dan di sini.

3. Contoh

Mari mulakan dengan contoh LuckyNumberGenerator. Kelas ini mempunyai satu kaedah awam untuk menghasilkan nombor bertuah:

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

4. Variasi Mengejek Kaedah Swasta

Untuk pengujian unit yang lengkap mengenai kaedah ini, kita perlu mengejek kaedah peribadi.

4.1. Kaedah Tanpa Hujah tetapi Dengan Nilai Pulangan

Sebagai contoh mudah, mari kita mengejek tingkah laku kaedah peribadi tanpa argumen dan memaksanya untuk mengembalikan nilai yang diinginkan:

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

Dalam kes ini, kita mengejek kaedah peribadi getDefaultLuckyNumber dan menjadikannya mengembalikan nilai 300.

4.2. Kaedah Dengan Hujah dan Nilai Pulangan

Seterusnya, mari kita mengejek tingkah laku kaedah peribadi dengan argumen dan memaksanya untuk mengembalikan nilai yang diinginkan:

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

Dalam kes ini, kita mengejek kaedah peribadi dan menjadikannya kembali 1.

Perhatikan bahawa kita tidak peduli dengan argumen input dan menggunakan ArgumentMatchers.anyInt () sebagai wildcard.

4.3. Pengesahan Pemohon Kaedah

Strategi terakhir kami adalah menggunakan PowerMock untuk mengesahkan penggunaan kaedah peribadi:

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

5. Peringatan

Akhirnya, walaupun kaedah peribadi dapat diuji menggunakan PowerMock, kita mesti lebih berhati-hati semasa menggunakan teknik ini.

Memandangkan tujuan pengujian kami adalah untuk mengesahkan tingkah laku kelas, kami harus menahan diri daripada mengubah tingkah laku dalaman kelas semasa ujian unit.

Teknik mengejek harus diterapkan pada kebergantungan luaran kelas dan bukan pada kelas itu sendiri.

Sekiranya mengejek kaedah swasta sangat mustahak untuk menguji kelas kami, biasanya menunjukkan reka bentuk yang buruk.

6. Kesimpulannya

Dalam artikel ringkas ini, kami menunjukkan bagaimana PowerMock dapat digunakan untuk memperluas kemampuan Mockito untuk mengejek dan mengesahkan kaedah peribadi di kelas yang diuji.

Kod sumber tutorial ini boleh didapati di GitHub.