Kaedah Statik Mock menggunakan JMockit

1. Gambaran keseluruhan

Beberapa perpustakaan mengejek popular seperti Mockito dan Easymock menghasilkan mock-up dengan memanfaatkan model kelas berasaskan warisan Java. EasyMock mengimplementasikan antara muka pada waktu runtime, sedangkan Mockito mewarisi dari kelas sasaran untuk membuat rintangan mengejek.

Kedua-dua pendekatan ini tidak berfungsi dengan baik untuk kaedah statik kerana kaedah statik dikaitkan dengan kelas dan tidak boleh diganti. Walau bagaimanapun, JMockit memang menyediakan kaedah mengejek kaedah statik.

Dalam tutorial ini, kita akan meneroka beberapa ciri ini.

Untuk pengenalan JMockit, sila lihat artikel kami sebelumnya.

2. Pergantungan Maven

Mari mulakan dengan pergantungan Maven:

 org.jmockit jmockit 1.24 test 

Anda boleh mendapatkan versi terbaru perpustakaan ini di Maven Central.

3. Kaedah Statik Dipanggil dari Kaedah Bukan Statik

Pertama, mari kita pertimbangkan kes apabila kita mempunyai kelas dengan kaedah bukan statik yang secara dalaman bergantung pada kaedah statik :

public class AppManager { public boolean managerResponse(String question) { return AppManager.isResponsePositive(question); } public static boolean isResponsePositive(String value) { if (value == null) { return false; } int length = value.length(); int randomNumber = randomNumber(); return length == randomNumber ? true : false; } private static int randomNumber() { return new Random().nextInt(7); } }

Sekarang, kami ingin menguji kaedah managerResponse (). Oleh kerana nilai pulangannya bergantung pada kaedah lain, kita perlu mengejek kaedah isResponsePositive () .

Kita boleh mengejek kaedah statik ini dengan menggunakan mockit kelas anonim JMockit.MockUp.MockUp ( di mana T akan menjadi nama kelas ) dan anotasi @Mock :

@Test public void givenAppManager_whenStaticMethodCalled_thenValidateExpectedResponse() { new MockUp() { @Mock public boolean isResponsePositive(String value) { return false; } }; assertFalse(appManager.managerResponse("Some string...")); }

Di sini, kita mengejek isResponsePositive () dengan nilai kembali yang ingin kita gunakan untuk ujian. Oleh itu, mengesahkan hasil yang diharapkan menggunakan utiliti Assertions yang terdapat di Junit-5.

4. Uji Kaedah Statik Swasta

Dalam beberapa kes, kaedah lain menggunakan kaedah statik peribadi kelas:

private static Integer stringToInteger(String num) { return Integer.parseInt(num); }

Untuk menguji kaedah tersebut, kita perlu mengejek kaedah statik peribadi . Kita boleh menggunakan kaedah utiliti Deencapsulation.invoke () yang disediakan oleh JMockit :

@Test public void givenAppManager_whenPrivateStaticMethod_thenValidateExpectedResponse() { int response = Deencapsulation.invoke(AppManager.class, "stringToInteger", "110"); assertEquals(110, response); }

Seperti namanya, tujuannya adalah untuk menguraikan keadaan objek. Dengan cara ini, JMockit mempermudah kaedah ujian yang tidak dapat diuji sebaliknya.

5. Kesimpulan

Dalam artikel ini, kita telah melihat bagaimana kaedah statik dapat diejek menggunakan JMockit . Untuk melihat lebih mendalam mengenai beberapa ciri lanjutan JMockit, lihat artikel JMockit Advanced Usage kami.

Seperti biasa, kod sumber penuh untuk tutorial ini boleh didapati di GitHub.