Penguasaan Pengujian: JUnit, Mockito & Ujian Integrasi · Pelajaran

Menetapkan Nilai Pulangan

Konfigurasikan objek mock untuk memulangkan nilai tertentu atau melontarkan pengecualian apabila kaedahnya dipanggil.

Pelajaran 1 daripada 411 langkah

Menetapkan Nilai Pulangan ialah pelajaran Penguasaan Pengujian: JUnit, Mockito & Ujian Integrasi percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Penguasaan Pengujian: JUnit, Mockito & Ujian Integrasi, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Penguasaan Pengujian: JUnit, Mockito & Ujian Integrasi merangkumi sejumlah 4 pelajaran.

Pengenalan kepada Stubbing Mock

Apabila anda mencipta objek mock, objek itu tidak mempunyai tingkah laku sebenar. Kaedahnya tidak melakukan apa-apa secara lalai dan sering mengembalikan null, 0 atau koleksi kosong.

Stubbing ialah proses mengajar objek mock cara memberikan respons terhadap panggilan kaedah tertentu. Ia seolah-olah anda memberikan skrip untuk diikuti oleh mock anda!

Hal ini membolehkan anda mengawal keadaan tepat untuk ujian anda dan mengasingkan kod yang sedang diuji.

Membuat Mock Mengembalikan Nilai

Cara paling biasa untuk melakukan stubbing pada mock adalah dengan menggunakan when().thenReturn(). Ini memberitahu Mockito: "Apabila kaedah tertentu ini dipanggil pada mock, kembalikan nilai yang telah ditetapkan ini."

  • when(mock.someMethod()).thenReturn(value);

value boleh berupa apa-apa objek atau jenis primitif yang sepadan dengan jenis pulangan kaedah tersebut.

Contoh Kod thenReturn()

Cuba jalankan contoh ringkas ini. Perhatikan bahawa kaedah add pada mock hanya mengembalikan nilai yang ditetapkan melalui stubbing apabila dipanggil dengan (1, 1).

import static org.mockito.Mockito.*;

interface CalculatorService {
    int add(int a, int b);
}

public class Main {
    public static void main(String[] args) {
        // Create a mock of CalculatorService
        CalculatorService mockCalc = mock(CalculatorService.class);

        // Stub the add(1, 1) method to return 5
        when(mockCalc.add(1, 1)).thenReturn(5);

        // Call the stubbed method
        System.out.println("1 + 1 = " + mockCalc.add(1, 1));

        // Call a method that was NOT stubbed
        System.out.println("2 + 2 = " + mockCalc.add(2, 2));
    }
}

Mock yang Menghasilkan Ralat

Kadang-kadang, anda perlu menguji cara kod anda mengendalikan ralat. Anda boleh mengkonfigurasi mock supaya menghasilkan pengecualian apabila kaedah tertentu dipanggil, dengan menggunakan when().thenThrow().

  • when(mock.failingMethod()).thenThrow(new SomeException("Error!"));

Ini penting untuk menguji laluan ralat dan memastikan aplikasi anda mengendalikan situasi yang tidak dijangka dengan baik.

Demonstrasi Kod thenThrow()

Dalam contoh ini, mock DataService kita dikonfigurasi untuk menghasilkan IllegalArgumentException jika kita cuba mendapatkan data dengan ID "invalid".

import static org.mockito.Mockito.*;

interface DataService {
    String fetchData(String id);
}

public class Main {
    public static void main(String[] args) {
        DataService mockData = mock(DataService.class);

        // Stub fetchData("invalid") to throw an exception
        when(mockData.fetchData("invalid"))
            .thenThrow(new IllegalArgumentException("ID not found!"));

        // Call a method that was NOT stubbed (returns null by default)
        System.out.println("Fetching 'valid': " + mockData.fetchData("valid"));

        // Call the stubbed method that throws an exception
        try {
            System.out.println("Fetching 'invalid': " + mockData.fetchData("invalid"));
        } catch (IllegalArgumentException e) {
            System.out.println("Caught error: " + e.getMessage());
        }
    }
}

Respons Dinamik: thenAnswer()

Bagaimana jika anda memerlukan respons mock bergantung pada argumen yang dihantar kepadanya atau perlu melaksanakan logik tersuai?

when().thenAnswer() ialah penyelesaiannya. Ia menerima objek Answer, yang sering berupa lambda atau kelas tanpa nama, untuk memberikan lebih banyak kawalan:

  • Anda boleh mengakses argumen kaedah sebenar.
  • Anda boleh melakukan pengiraan atau logik yang kompleks.
  • Anda boleh mengembalikan nilai atau menghasilkan pengecualian secara dinamik.

Demonstrasi Kod thenAnswer()

Di sini, kaedah multiply pada mock kita benar-benar melakukan pendaraban berdasarkan argumen yang diterimanya. Ini lebih dinamik berbanding nilai pulangan tetap.

import static org.mockito.Mockito.*;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;

interface MathService {
    int multiply(int a, int b);
}

public class Main {
    public static void main(String[] args) {
        MathService mockMath = mock(MathService.class);

        // Stub multiply for any two integers to perform actual multiplication
        when(mockMath.multiply(anyInt(), anyInt())).thenAnswer(
            new Answer<Integer>() {
                public Integer answer(InvocationOnMock invocation) {
                    Object[] args = invocation.getArguments();
                    Integer arg1 = (Integer) args[0];
                    Integer arg2 = (Integer) args[1];
                    return arg1 * arg2; // Custom logic based on arguments
                }
            }
        );

        System.out.println("3 * 4 = " + mockMath.multiply(3, 4));
        System.out.println("5 * 2 = " + mockMath.multiply(5, 2));
        System.out.println("7 * 0 = " + mockMath.multiply(7, 0));
    }
}

Pelbagai Pulangan: Rantaian

Bagaimana jika anda mahu kaedah mock mengembalikan nilai yang berbeza pada setiap panggilan berturutan?

Mockito membolehkan anda merantaikan kaedah stubbing. Anda boleh memberikan beberapa nilai pulangan kepada thenReturn(), atau merantaikan beberapa panggilan thenReturn(), thenThrow() atau thenAnswer().

  • when(mock.method()).thenReturn(val1, val2, val3);
  • when(mock.method()).thenReturn(val1).thenThrow(ex).thenReturn(val3);

Selepas semua nilai atau tindakan yang ditentukan telah digunakan, yang terakhir akan diulang untuk panggilan seterusnya.

Demonstrasi Stubbing Berantai

Perhatikan cara mock Queue kita mengembalikan "Item A", kemudian "Item B", dan selepas itu menghasilkan pengecualian pada panggilan poll() seterusnya.

import static org.mockito.Mockito.*;
import java.util.Queue;
import java.util.LinkedList;

public class Main {
    public static void main(String[] args) {
        Queue<String> mockQueue = mock(Queue.class);

        // Stub poll() to return different values/actions on successive calls
        when(mockQueue.poll())
            .thenReturn("Item A")
            .thenReturn("Item B")
            .thenThrow(new IllegalStateException("Queue is empty!"));

        System.out.println("Poll 1: " + mockQueue.poll()); // Returns "Item A"
        System.out.println("Poll 2: " + mockQueue.poll()); // Returns "Item B"

        try {
            System.out.println("Poll 3: " + mockQueue.poll()); // Throws exception
        } catch (IllegalStateException e) {
            System.out.println("Caught error on Poll 3: " + e.getMessage());
        }

        // Subsequent calls will repeat the last action (throw exception)
        try {
            System.out.println("Poll 4: " + mockQueue.poll());
        } catch (IllegalStateException e) {
            System.out.println("Caught error on Poll 4: " + e.getMessage());
        }
    }
}

Semak Pemahaman Anda

Anda sedang menguji kaedah yang memproses item daripada baris gilir. Anda perlu memastikan kaedah poll() pada baris gilir mengembalikan "Task 1", kemudian "Task 2", dan akhirnya null yang menunjukkan baris gilir kosong untuk panggilan seterusnya. Pendekatan stubbing Mockito yang manakah akan anda gunakan?

Nilai Pulangan Stubbing: Imbas Kembali

Dalam pelajaran ini, anda telah belajar mengawal tingkah laku objek mock dengan melakukan stubbing pada panggilan kaedahnya. Ini penting untuk mengasingkan unit yang sedang diuji dan mewujudkan persekitaran ujian yang boleh dijangka.

  • when().thenReturn(): Untuk membuat kaedah mock mengembalikan nilai tertentu.
  • when().thenThrow(): Untuk membuat kaedah mock menghasilkan pengecualian.
  • when().thenAnswer(): Untuk respons dinamik berdasarkan argumen kaedah atau logik tersuai.
  • Rantaian: Untuk mentakrifkan urutan tingkah laku yang berbeza bagi panggilan berturutan pada kaedah yang sama.

Seterusnya, kita akan meneroka pemadan argumen Mockito untuk stubbing dan pengesahan yang lebih fleksibel!

Percuma untuk bermula

Pelajari Penguasaan Pengujian: JUnit, Mockito & Ujian Integrasi dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
12
Pelajaran
48

Soalan Lazim

Adakah pelajaran “Menetapkan Nilai Pulangan” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Penguasaan Pengujian: JUnit, Mockito & Ujian Integrasi, termasuk “Menetapkan Nilai Pulangan”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Penguasaan Pengujian: JUnit, Mockito & Ujian Integrasi merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Menetapkan Nilai Pulangan”?

Konfigurasikan objek mock untuk memulangkan nilai tertentu atau melontarkan pengecualian apabila kaedahnya dipanggil. Anda berlatih Penguasaan Pengujian: JUnit, Mockito & Ujian Integrasi menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Penguasaan Pengujian: JUnit, Mockito & Ujian Integrasi?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Penguasaan Pengujian: JUnit, Mockito & Ujian Integrasi di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “Menetapkan Nilai Pulangan” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Penguasaan Pengujian: JUnit, Mockito & Ujian Integrasi ini?

Ya. Setiap pelajaran Penguasaan Pengujian: JUnit, Mockito & Ujian Integrasi menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Menetapkan Nilai Pulangan
  2. Pemadan Argumen Mockito
  3. Memerhati Objek Sebenar
  4. Melontar Pengecualian dan Panggilan Berturutan
← Kembali ke Penguasaan Pengujian: JUnit, Mockito & Ujian Integrasi