Panduan Cepat untuk BDDMockito

1. Ikhtisar

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

BDD mendorong tes menulis dalam bahasa alami yang dapat dibaca manusia yang berfokus pada perilaku aplikasi.

Ini mendefinisikan cara terstruktur dengan jelas untuk menulis tes mengikuti tiga bagian (Atur, Bertindak, Tegaskan):

  • diberikan beberapa prasyarat (Atur)
  • ketika suatu tindakan terjadi (Act)
  • kemudian verifikasi output (Assert)

Pustaka Mockito dikirimkan dengan kelas BDDMockito yang memperkenalkan API ramah-BDD. API ini memungkinkan kita untuk mengambil pendekatan yang lebih ramah BDD dengan mengatur pengujian kita menggunakan given () dan membuat pernyataan menggunakan then () .

Pada artikel ini, kami akan menjelaskan cara mengatur tes Mockito berbasis BDD kami. Kami juga akan berbicara tentang perbedaan antara API Mockito dan BDDMockito , untuk akhirnya fokus pada API BDDMockito .

2. Penyiapan

2.1. Dependensi Maven

Rasa BDD Mockito adalah bagian dari pustaka inti-mockito , untuk memulai kita hanya perlu menyertakan artefak:

 org.mockito mockito-core 2.21.0 

Untuk versi terbaru Mockito, silakan periksa Maven Central.

2.2. Impor

Pengujian kami dapat menjadi lebih mudah dibaca jika kami menyertakan impor statis berikut:

import static org.mockito.BDDMockito.*;

Perhatikan bahwa BDDMockito memperluas Mockito , jadi kami tidak akan melewatkan fitur apa pun yang disediakan oleh API Mockito tradisional .

3. Mockito vs. BDDMockito

Ejekan tradisional di Mockito dilakukan dengan menggunakan when (obj) . lalu * () di langkah Atur.

Nanti, interaksi dengan tiruan kami dapat divalidasi menggunakan verifikasi () di langkah Assert.

BDDMockito menyediakan alias BDD untuk berbagai metode Mockito , sehingga kita dapat menulis langkah Atur menggunakan yang diberikan (bukan kapan ), demikian juga, kita dapat menulis langkah Tegaskan menggunakan then (alih-alih memverifikasi ).

Mari kita lihat contoh tubuh uji menggunakan Mockito tradisional:

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

Mari kita lihat perbandingannya dengan BDDMockito :

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

4. Mengolok- olok Dengan BDDMockito

Mari kita coba untuk menguji PhoneBookService di mana kita perlu meniru 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 memungkinkan kita mengembalikan nilai yang mungkin tetap atau dinamis. Itu juga akan memungkinkan kami untuk membuat pengecualian:

4.1. Mengembalikan Nilai Tetap

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

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

4.2. Mengembalikan Nilai Dinamis

BDDMockito memungkinkan kami menyediakan cara yang lebih canggih untuk mengembalikan nilai. Kita bisa mengembalikan hasil dinamis berdasarkan masukan:

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. Melempar Pengecualian

Memberitahu Mockito untuk melakukan 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 akan * , itu wajib jika kita mengejek metode yang tidak memiliki nilai pengembalian.

Perhatikan juga bahwa kami menggunakan pencocok argumen seperti ( any , eq ) untuk menyediakan cara yang lebih umum dalam mengejek berdasarkan kriteria daripada bergantung pada nilai tetap.

5. Kesimpulan

Dalam tutorial singkat ini, kami membahas bagaimana BDDMockito mencoba menghadirkan kemiripan BDD dengan pengujian Mockito kami, dan kami membahas beberapa perbedaan antara Mockito dan BDDMockito .

Seperti biasa, kode sumber dapat ditemukan di GitHub - dalam paket pengujian com.baeldung.bddmockito .