Panduan Pantas untuk BDDMockito

1. Gambaran keseluruhan

Istilah BDD diciptakan pertama kali oleh Dan North - pada tahun 2006.

BDD mendorong ujian menulis dalam bahasa semula jadi, yang dapat dibaca oleh manusia yang memberi tumpuan kepada tingkah laku aplikasi.

Ia menentukan kaedah penulisan ujian yang tersusun dengan jelas mengikut tiga bahagian (Susun, Bertindak, Tegaskan):

  • diberi beberapa prasyarat (Susun)
  • apabila tindakan berlaku (Akta)
  • kemudian sahkan output (Tegaskan)

Perpustakaan Mockito dihantar dengan kelas BDDMockito yang memperkenalkan API mesra BDD. API ini membolehkan kami mengambil pendekatan yang lebih mesra BDD mengatur ujian kami dengan menggunakan () dan membuat penegasan menggunakan kemudian () .

Dalam artikel ini, kami akan menerangkan cara menyediakan ujian Mockito berasaskan BDD kami. Kami juga akan bercakap tentang perbezaan antara Mockito dan BDDMockito API, untuk akhirnya memberi tumpuan kepada BDDMockito API.

2. Persediaan

2.1. Ketergantungan Maven

Rasa BDD Mockito adalah sebahagian dari perpustakaan inti mockito , untuk memulakan, kita hanya perlu memasukkan artifak:

 org.mockito mockito-core 2.21.0 

Untuk versi terbaru Mockito sila periksa Maven Central.

2.2. Import

Ujian kami boleh menjadi lebih mudah dibaca sekiranya kami memasukkan import statik berikut:

import static org.mockito.BDDMockito.*;

Perhatikan bahawa BDDMockito memperluas Mockito , jadi kami tidak akan kehilangan sebarang fitur yang disediakan oleh API Mockito tradisional .

3. Mockito lwn BDDMockito

Ejekan tradisional di Mockito dilakukan dengan menggunakan ketika (obj) . kemudian * () dalam langkah Susun.

Kemudian, interaksi dengan ejekan kami dapat disahkan menggunakan verifikasi () pada langkah Tegaskan.

BDDMockito menyediakan alias BDD untuk pelbagai kaedah Mockito , jadi kami dapat menulis langkah Susun kami dengan menggunakan yang diberikan (bukan kapan ), begitu juga, kami dapat menulis langkah Tegas kami menggunakan kemudian (bukannya mengesahkan ).

Mari lihat contoh badan ujian menggunakan Mockito tradisional:

when(phoneBookRepository.contains(momContactName)) .thenReturn(false); phoneBookService.register(momContactName, momPhoneNumber); verify(phoneBookRepository) .insert(momContactName, momPhoneNumber);

Mari lihat bagaimana perbandingannya dengan BDDMockito :

given(phoneBookRepository.contains(momContactName)) .willReturn(false); phoneBookService.register(momContactName, momPhoneNumber); then(phoneBookRepository) .should() .insert(momContactName, momPhoneNumber);

4. Mengejek Dengan BDDMockito

Mari cuba menguji Perkhidmatan PhoneBook di mana kita perlu mengejek PhoneBookRepository:

public class PhoneBookService { private PhoneBookRepository phoneBookRepository; public void register(String name, String phone) { if(!name.isEmpty() && !phone.isEmpty() && !phoneBookRepository.contains(name)) { phoneBookRepository.insert(name, phone); } } public String search(String name) { if(!name.isEmpty() && phoneBookRepository.contains(name)) { return phoneBookRepository.getPhoneNumberByContactName(name); } return null; } }

BDDMockito sebagai Mockito membolehkan kita mengembalikan nilai yang mungkin tetap atau dinamik. Ini juga membolehkan kita membuang pengecualian:

4.1. Mengembalikan Nilai Tetap

Dengan menggunakan BDDMockito, kita dapat dengan mudah mengkonfigurasi Mockito untuk mengembalikan hasil tetap setiap kali kaedah sasaran objek tiruan kita dipanggil:

given(phoneBookRepository.contains(momContactName)) .willReturn(false); phoneBookService.register(xContactName, ""); then(phoneBookRepository) .should(never()) .insert(momContactName, momPhoneNumber);

4.2. Mengembalikan Nilai Dinamik

BDDMockito membolehkan kami memberikan cara yang lebih canggih untuk mengembalikan nilai. Kami dapat mengembalikan hasil yang dinamik berdasarkan input:

given(phoneBookRepository.contains(momContactName)) .willReturn(true); given(phoneBookRepository.getPhoneNumberByContactName(momContactName)) .will((InvocationOnMock invocation) -> invocation.getArgument(0).equals(momContactName) ? momPhoneNumber : null); phoneBookService.search(momContactName); then(phoneBookRepository) .should() .getPhoneNumberByContactName(momContactName); 

4.3. Melemparkan Pengecualian

Memberitahu Mockito untuk membuang pengecualian cukup mudah:

given(phoneBookRepository.contains(xContactName)) .willReturn(false); willThrow(new RuntimeException()) .given(phoneBookRepository) .insert(any(String.class), eq(tooLongPhoneNumber)); try { phoneBookService.register(xContactName, tooLongPhoneNumber); fail("Should throw exception"); } catch (RuntimeException ex) { } then(phoneBookRepository) .should(never()) .insert(momContactName, tooLongPhoneNumber);

Perhatikan bagaimana kita menukar posisi yang diberikan dan kehendak * , itu wajib sekiranya kita mengejek kaedah yang tidak memiliki nilai pengembalian.

Perhatikan juga bahawa kami menggunakan pencocokan argumen seperti ( mana pun , persamaan ) untuk memberikan cara mengejek yang lebih umum berdasarkan kriteria dan bukannya bergantung pada nilai tetap.

5. Kesimpulan

Dalam tutorial ringkas ini, kami membincangkan bagaimana BDDMockito cuba memberikan kemiripan BDD dengan ujian Mockito kami, dan kami membincangkan beberapa perbezaan antara Mockito dan BDDMockito .

Seperti biasa, kod sumber boleh didapati di GitHub - dalam pakej ujian com.baeldung.bddmockito .