Rumah  >  Artikel  >  Java  >  Bagaimana untuk Mengejek Kaedah Subkelas Semasa Memelihara Pelaksanaan Superclass dalam Mockito?

Bagaimana untuk Mengejek Kaedah Subkelas Semasa Memelihara Pelaksanaan Superclass dalam Mockito?

Patricia Arquette
Patricia Arquetteasal
2024-11-02 14:08:30770semak imbas

How to Mock Subclass Methods While Preserving Superclass Implementations in Mockito?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn