Kaedah Subkelas Mengejek Semasa Mengekalkan Pelaksanaan Superclass
Mockito, rangka kerja mengejek Java yang digunakan secara meluas, sering menghadapi cabaran untuk mengejek kaedah tertentu secara selektif dalam hierarki kelas. Artikel ini menangani senario di mana anda ingin mengejek hanya panggilan kepada kaedah yang diwarisi daripada superclass.
Pernyataan Masalah
Pertimbangkan struktur kelas berikut:
<code class="java">class BaseService { public void save() {...} } public Childservice extends BaseService { public void save(){ //some code super.save(); } } </code>
Dalam ujian unit, anda mungkin mahu mengejek hanya panggilan kedua ke super.save() tanpa menjejaskan pelaksanaan dalam ChildService.
Penyelesaian
Walaupun biasanya tidak disyorkan untuk memfaktorkan semula hierarki kelas sedia ada untuk tujuan ujian, terdapat cara untuk menangani cabaran ini tanpa mengubah asas kod.
Pertimbangkan pendekatan berikut:
<code class="java">class BaseService { public void validate(){ fail(" I must not be called"); } public void save(){ //Save method of super will still be called. validate(); } } class ChildService extends BaseService{ public void load(){} public void save(){ super.save(); load(); } } @Test public void testSave() { ChildService classToTest = Mockito.spy(new ChildService()); // Prevent/stub logic in super.save() Mockito.doNothing().when((BaseService)classToTest).validate(); // When classToTest.save(); // Then verify(classToTest).load(); }</code>
Penyelesaian ini memanfaatkan API Mockito.spy() Mockito untuk membungkus contoh kelas ChildService. Kemudian, ia mengatasi kaedah validate() BaseService (superclass) menggunakan Mockito.doNothing(). Ini memastikan bahawa logik dalam validate() dielakkan semasa ujian. Akibatnya, pelaksanaan sebenar ChildService.save() dipanggil, manakala panggilan ke super.save() dihentikan dengan berkesan.
Nota Tambahan
Ini teknik harus digunakan dengan berhati-hati, kerana kaedah luaran yang mengejek atau mengejek boleh membawa kepada ujian yang rapuh dan memberi kesan kepada ketepatan keputusan ujian anda. Walau bagaimanapun, ia boleh menjadi penyelesaian pragmatik apabila pemfaktoran semula hierarki kelas bukan pilihan.
Atas ialah kandungan terperinci Bagaimana untuk Mengejek Kaedah Subkelas Semasa Memelihara Pelaksanaan Superclass dalam Mockito?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!