Mengejek vs. Mengintip dalam kerangka mengejek

131

Dalam kerangka mengejek, Anda bisa mengejek objek atau mata - mata itu. Apa perbedaan antara keduanya dan kapan saya harus menggunakan satu di atas yang lain?

Melihat Mockito , misalnya, saya melihat hal-hal serupa dilakukan dengan menggunakan mata - mata dan cemoohan , tetapi saya tidak yakin mengenai perbedaan antara keduanya.

Vivin Paliath
sumber

Jawaban:

157

Objek tiruan menggantikan kelas mocked sepenuhnya, mengembalikan nilai yang direkam atau standar. Anda dapat membuat tiruan dari "udara tipis". Inilah yang sebagian besar digunakan selama pengujian unit.

Saat memata-matai, Anda mengambil objek yang ada dan "mengganti" hanya beberapa metode. Ini berguna ketika Anda memiliki kelas besar dan hanya ingin mengejek metode tertentu (mengejek parsial). Izinkan saya mengutip dokumentasi Mockito :

Anda dapat membuat mata-mata benda nyata. Bila Anda menggunakan mata-mata maka sesungguhnya metode disebut (kecuali metode yang mematikan).

Mata-mata nyata harus digunakan dengan hati-hati dan kadang-kadang , misalnya ketika berhadapan dengan kode warisan.

Jika ragu, gunakan cemoohan.

Tomasz Nurkiewicz
sumber
1
Terima kasih! Itu membuatnya jauh lebih jelas. Jadi ejekan tidak pernah mendelegasikan ke objek sebenarnya yang pernah diejek , tetapi mata-mata melakukannya.
Vivin Paliath
7
Mock tidak memiliki "objek aktual" - mock dibuat ab initio.
Carl Manaster
4
Adakah penjelasan mengapa Mockito memperingatkan untuk tidak menggunakan mata-mata sepanjang waktu? Saya melihat bahwa mereka mengatakan untuk mengolok-olok, tetapi saya tidak jelas tentang alasan mengapa.
Matt
9
Saya tidak yakin, tapi mungkin karena mereka "Mockito" dan bukan "Spyito": D
typoerrpr
16

Mockito memperingatkan bahwa mengejek parsial bukanlah praktik yang baik dan Anda harus merevisi arsitektur Berorientasi Objek Anda. Spy (atau ejekan parsial) disarankan untuk menguji kode lawas .

Suelmar Zanetti
sumber
16

Saya akan mencoba menjelaskan menggunakan contoh di sini:

// Difference between mocking, stubbing and spying
@Test
public void differenceBetweenMockingSpyingAndStubbing() {
    List list = new ArrayList();
    list.add("abc");
    assertEquals(1, list.size());

    List mockedList = spy(list);
    when(mockedList.size()).thenReturn(10);
    assertEquals(10, mockedList.size());
}

Di sini, kami memiliki objek nyata awal list, di mana kami menambahkan satu elemen dan ukuran yang diharapkan menjadi satu.

Kami memata-matai objek nyata yang berarti bahwa kami dapat menginstruksikan metode mana yang harus di- stub . Jadi kami menyatakan bahwa kami mematikan metode - size()pada objek mata-mata yang akan mengembalikan 10, tidak peduli berapa ukuran sebenarnya.

Singkatnya, Anda akan memata - matai objek nyata dan mematikan beberapa metode .

pengguna2775185
sumber
2

Referensi: http://javapointers.com/tutorial/difference-between-spy-and-mock-in-mockito/

Saat menggunakan objek tiruan, perilaku default metode ketika tidak stub adalah tidak melakukan apa-apa. Sederhana berarti, jika itu adalah metode batal, maka itu tidak akan melakukan apa-apa ketika Anda memanggil metode atau jika itu adalah metode dengan pengembalian maka dapat mengembalikan nol, kosong atau nilai default.

Sementara di objek mata-mata, tentu saja, karena ini adalah metode nyata, ketika Anda tidak mematikan metode, maka itu akan memanggil perilaku metode nyata. Jika Anda ingin mengubah dan mengejek metode ini, maka Anda harus mematikannya.

Jerry C.
sumber
2

Benda-benda tiruan diedarkan tetapi tidak pernah benar-benar digunakan. Biasanya mereka hanya digunakan untuk mengisi daftar parameter.

Objek palsu sebenarnya memiliki implementasi yang berfungsi, tetapi biasanya mengambil beberapa jalan pintas yang membuatnya tidak cocok untuk produksi (database memori adalah contoh yang baik).

Rintisan bertopik memberikan jawaban kalengan untuk panggilan yang dilakukan selama tes, biasanya tidak menanggapi apa pun di luar apa yang diprogram dalam tes.

Mata - mata adalah bertopik yang juga merekam beberapa informasi berdasarkan bagaimana mereka dipanggil. Salah satu bentuknya mungkin layanan email yang merekam berapa banyak pesan yang dikirim.

Mengejek adalah apa yang kita bicarakan di sini: objek diprogram dengan harapan yang membentuk spesifikasi panggilan yang diharapkan akan mereka terima.

Mocks Aron't Stubs oleh Martin Fowler

Mohsen
sumber
1

Mata-mata memiliki dua definisi. Satu, adalah tempat metode nyata dipanggil, yang lain di mana, tidak ada fungsi yang dipanggil dan hanya nilai-nilai ekuivalen nol atau nol yang dikembalikan, tetapi metode dipanggil, dan statusnya dicatat, umumnya seperti, metode x disebut y kali.

John Heilman
sumber
0

Di Mockito jika Anda menetapkan objek apa pun ke variabel instance dari Objek Mock maka tidak mempengaruhi pada Objek Mock.

Tetapi dalam kasus Spy, jika Anda menetapkan objek apa pun ke variabel instan Objek Spy maka tidak memengaruhi Objek Spy karena Spy bertindak seperti modifikasi objek waktu-nyata.

Sebagai contoh referensi adalah

@RunWith(MockitoJUnitRunner.class)
public class MockSpyExampleTest {

    @Mock
    private List<String> mockList;

    @Spy
    private List<String> spyList = new ArrayList();

    @Test
    public void testMockList() {
        //by default, calling the methods of mock object will do nothing
        mockList.add("test");
        assertNull(mockList.get(0));
    }

    @Test
    public void testSpyList() {
        //spy object will call the real method when not stub
        spyList.add("test");
        assertEquals("test", spyList.get(0));
    }
}
Yasir Shabbir Choudhary
sumber