1. Gambaran keseluruhan
Dalam tutorial ini, kami akan menerangkan bagaimana memanfaatkan mata - mata di Mockito .
Kami akan membincangkan tentang penjelasan @Spy , cara mengintip pengintip dan, akhirnya - kami akan membezakan Mock dan Perisik .
Dan tentu saja, untuk lebih banyak kebaikan Mockito, lihat siri ini di sini.
2. Contoh Perisik Mudah
Mari kita mulakan dengan contoh mudah bagaimana menggunakan pengintip .
Ringkasnya, API itu Mockito.spy () - untuk mengintip objek sebenar .
Ini akan membolehkan kita memanggil semua kaedah normal objek sambil tetap mengesan setiap interaksi, seperti yang kita lakukan dengan ejekan.
OK, mari kita buat contoh ringkas di mana kita akan mengintip objek ArrayList yang ada :
@Test public void whenSpyingOnList_thenCorrect() { List list = new ArrayList(); List spyList = Mockito.spy(list); spyList.add("one"); spyList.add("two"); Mockito.verify(spyList).add("one"); Mockito.verify(spyList).add("two"); assertEquals(2, spyList.size()); }
Perhatikan bagaimana kaedah sebenar () sebenarnya dipanggil dan bagaimana ukuran spyList menjadi 2.
3. Anotasi @Spy
Seterusnya - mari lihat bagaimana menggunakan anotasi @Spy . Kita boleh menggunakan penjelasan @Spy dan bukannya mata - mata () seperti dalam contoh berikut:
@Spy List spyList = new ArrayList(); @Test public void whenUsingTheSpyAnnotation_thenObjectIsSpied() { spyList.add("one"); spyList.add("two"); Mockito.verify(spyList).add("one"); Mockito.verify(spyList).add("two"); assertEquals(2, spyList.size()); }
Untuk mengaktifkan anotasi Mockito (seperti @Spy , @Mock , ...) - kita perlu melakukan salah satu perkara berikut:
- Panggil kaedah MockitoAnnotations.initMocks (ini) untuk memulakan medan anotasi
- Gunakan pelari terbina dalam @RunWith (MockitoJUnitRunner.class)
4. Menghentam Perisik
Sekarang - Mari lihat bagaimana cara mengintip Mata - Mata . Kita boleh mengkonfigurasi / mengatasi tingkah laku kaedah menggunakan sintaks yang sama dengan yang kita gunakan dengan ejekan.
Dalam contoh berikut - kami menggunakan doReturn () untuk mengatasi kaedah size () :
@Test public void whenStubASpy_thenStubbed() { List list = new ArrayList(); List spyList = Mockito.spy(list); assertEquals(0, spyList.size()); Mockito.doReturn(100).when(spyList).size(); assertEquals(100, spyList.size()); }
5. Mock vs Spy dalam Mockito
Sekarang - mari kita bincangkan perbezaan antara Mock dan Spy di Mockito - bukan perbezaan teori antara kedua konsep, bagaimana perbezaannya di dalam Mockito itu sendiri.
Apabila Mockito membuat ejekan - ia melakukannya dari Kelas Jenis, bukan dari contoh sebenar. Ejekan hanya membuat contoh cangkang kelas tanpa tulang , sepenuhnya diarahkan untuk mengesan interaksi dengannya.
Sebaliknya, mata-mata akan membungkus contoh yang ada . Ini masih akan berlaku dengan cara yang sama seperti contoh biasa - satu-satunya perbezaan adalah ia juga akan diinstruksikan untuk melacak semua interaksi dengannya.
Dalam contoh berikut - kami membuat olok-olok daripada ArrayList kelas:
@Test public void whenCreateMock_thenCreated() { List mockedList = Mockito.mock(ArrayList.class); mockedList.add("one"); Mockito.verify(mockedList).add("one"); assertEquals(0, mockedList.size()); }
Seperti yang kita lihat - menambahkan elemen ke dalam senarai ejekan sebenarnya tidak menambah apa-apa - ia hanya memanggil kaedah tersebut tanpa kesan sampingan yang lain.
A mata-mata di sisi lain akan berkelakuan berbeza - ia benar-benar akan memanggil pelaksanaan sebenar add kaedah dan menambah elemen ke senarai asas:
@Test public void whenCreateSpy_thenCreate() { List spyList = Mockito.spy(new ArrayList()); spyList.add("one"); Mockito.verify(spyList).add("one"); assertEquals(1, spyList.size()); }
6. Memahami Mockito NotAMockException
Di bahagian akhir ini, kita akan belajar mengenai Mockito NotAMockException . Pengecualian ini adalah salah satu pengecualian biasa yang mungkin akan kita hadapi ketika menyalahgunakan ejekan atau mata-mata .
Mari mulakan dengan melihat dalam keadaan apa pengecualian ini dapat terjadi:
List list = new ArrayList(); Mockito.doReturn(100).when(list).size(); assertEquals("Size should be 100: ", 100, list.size());
Apabila kami menjalankan coretan kod ini, kami akan mendapat ralat berikut:
org.mockito.exceptions.misusing.NotAMockException: Argument passed to when() is not a mock! Example of correct stubbing: doThrow(new RuntimeException()).when(mock).someMethod();
Syukurlah, jelas dari mesej ralat Mockito apa masalahnya di sini. Dalam contoh kita, objek senarai bukan ejekan. Kaedah Mockito when () mengharapkan objek olok-olok atau mata-mata sebagai hujah .
Seperti yang kita dapat lihat, pesan Pengecualian bahkan menerangkan seperti apa pemohon yang betul. Sekarang kita mempunyai pemahaman yang lebih baik mengenai masalahnya, mari kita perbaiki mengikut cadangan:
final List spyList = Mockito.spy(new ArrayList()); Mockito.doReturn(100).when(spyList).size(); assertEquals("Size should be 100: ", 100, spyList.size());
Contoh kita sekarang bertindak seperti yang diharapkan dan kita tidak lagi melihat Mockito NotAMockException.
7. Kesimpulannya
Dalam artikel ringkas ini, kami membincangkan contoh-contoh yang paling berguna untuk menggunakan mata-mata Mockito.
Kami belajar bagaimana membuat mata - mata , bagaimana menggunakan penjelasan @Spy , bagaimana untuk mengintip pengintip dan, akhirnya - perbezaan antara Mock dan Perisik .
Pelaksanaan semua contoh ini boleh didapati di GitHub .
Ini adalah projek Maven, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.
Dan tentu saja, untuk lebih banyak kebaikan Mockito, lihat siri ini di sini.