Pengantar MockServer

1. Ikhtisar

MockServer adalah alat untuk mengejek / menghentikan API HTTP eksternal.

2. Ketergantungan Maven

Untuk menggunakan MockServer dalam aplikasi kita, kita perlu menambahkan dua dependensi:

 org.mock-server mockserver-netty 3.10.8   org.mock-server mockserver-client-java 3.10.8 

Versi terbaru dari dependensi tersedia sebagai mockserver-netty dan mockserver-client.

3. Fungsi MockServer

Sederhananya, alat tersebut dapat:

  • menghasilkan dan mengembalikan tanggapan tetap
  • meneruskan permintaan ke server lain
  • mengeksekusi panggilan balik
  • verifikasi permintaan

4. Bagaimana Menjalankan MockServer

Kami dapat memulai server dengan beberapa cara berbeda - mari jelajahi beberapa metode ini.

4.1. Peluncuran melalui Plugin Maven

Ini akan meluncurkan server selama tahap proses-uji-kelas dan berhenti di tahap verifikasi :

 org.mock-server mockserver-maven-plugin 3.10.8  1080 1090 DEBUG org.mockserver.maven.ExampleInitializationClass    process-test-classes process-test-classes  start    verify verify  stop    

4.2. Peluncuran melalui Java API

Kita bisa menggunakan API Java startClientAndServer () untuk memulai server. Biasanya, kami akan memulai server sebelum menjalankan semua tes:

public class TestMockServer { private ClientAndServer mockServer; @BeforeClass public void startServer() { mockServer = startClientAndServer(1080); } @AfterClass public void stopServer() { mockServer.stop(); } // ... }

5. Klien Mock

MockServerClient API digunakan untuk menyediakan kemampuan untuk terhubung ke MockServer. Ini memodelkan permintaan dan tanggapan yang sesuai dari server.

Ini mendukung banyak operasi:

5.1. Menciptakan Harapan Dengan Tanggapan Mock

Harapan adalah mekanisme yang kami gunakan untuk mengejek permintaan dari klien dan respons yang dihasilkan dari MockServer.

Untuk membuat ekspektasi, kita perlu mendefinisikan request matcher dan respon yang harus dikembalikan.

Permintaan dapat dicocokkan menggunakan:

  • jalur - jalur URL
  • string kueri - parameter URL
  • header - minta header
  • cookie - cookie sisi klien
  • body - Isi permintaan POST dengan XPATH, JSON, skema JSON, ekspresi reguler, teks biasa yang cocok persis atau parameter isi

Semua parameter di atas dapat ditentukan menggunakan teks biasa atau ekspresi reguler.

Dan tindakan tanggapan akan berisi:

  • kode status - kode status HTTP yang valid misalnya 200, 400 dll.
  • body - ini adalah urutan byte yang berisi konten apa pun
  • headers - respon header dengan nama dan satu atau lebih nilai
  • cookies - respon cookies dengan nama dan satu atau lebih nilai

Mari kita lihat bagaimana kita bisa menciptakan ekspektasi :

public class TestMockServer { private void createExpectationForInvalidAuth() { new MockServerClient("127.0.0.1", 1080) .when( request() .withMethod("POST") .withPath("/validate") .withHeader("\"Content-type\", \"application/json\"") .withBody(exact("{username: 'foo', password: 'bar'}")), exactly(1)) .respond( response() .withStatusCode(401) .withHeaders( new Header("Content-Type", "application/json; charset=utf-8"), new Header("Cache-Control", "public, max-age=86400")) .withBody("{ message: 'incorrect username and password combination' }") .withDelay(TimeUnit.SECONDS,1) ); } // ... }

Di sini, kami menghentikan permintaan POST ke server. Dan kami telah menetapkan bahwa berapa kali kami perlu membuat permintaan ini menggunakan (1) panggilan.

Saat menerima permintaan ini, kami telah mengejek respons dengan bidang seperti kode status, header, dan isi respons.

5.2. Meneruskan Permintaan

Harapan dapat diatur untuk meneruskan permintaan. Beberapa parameter dapat menggambarkan tindakan maju:

  • tuan rumah - tuan rumah yang akan diteruskan misalnya www.baeldung.com
  • port - port tempat permintaan diteruskan, port default adalah 80
  • skema - protokol yang akan digunakan misalnya HTTP atau HTTPS

Mari kita lihat contoh permintaan penerusan:

private void createExpectationForForward(){ new MockServerClient("127.0.0.1", 1080) .when( request() .withMethod("GET") .withPath("/index.html"), exactly(1)) .forward( forward() .withHost("www.mock-server.com") .withPort(80) .withScheme(HttpForward.Scheme.HTTP) ); }

Dalam kasus ini, kami telah mengejek permintaan yang akan menekan MockServer persis satu dan kemudian diteruskan ke server lain. Metode outer forward () menentukan tindakan maju dan panggilan metode inner forward () membantu membangun URL dan meneruskan permintaan.

5.3. Menjalankan Panggilan Balik

Server dapat diatur untuk menjalankan panggilan balik saat menerima permintaan tertentu. Tindakan panggilan balik dapat menentukan kelas panggilan balik yang mengimplementasikan antarmuka org.mockserver.mock.action.ExpectationCallback . Ini harus memiliki konstruktor default dan harus berada di jalur kelas.

Mari kita lihat contoh ekspektasi dengan callback:

private void createExpectationForCallBack() { mockServer .when( request().withPath("/callback")) .callback( callback() .withCallbackClass("com.baeldung.mock.server.TestExpectationCallback") ); }

Di sini, callback luar () menetapkan tindakan panggilan balik dan metode callback batin () menentukan instance kelas metode callback.

Dalam kasus ini, saat MockServer menerima permintaan dengan / callback, maka metode penanganan panggilan balik yang diterapkan di kelas yang ditentukan akan dijalankan:

public class TestExpectationCallback implements ExpectationCallback { public HttpResponse handle(HttpRequest httpRequest) { if (httpRequest.getPath().getValue().endsWith("/callback")) { return httpResponse; } else { return notFoundResponse(); } } public static HttpResponse httpResponse = response() .withStatusCode(200); }

5.4. Memverifikasi Permintaan

MockServerClient memiliki kemampuan untuk memeriksa apakah sistem yang diuji mengirim permintaan:

private void verifyPostRequest() { new MockServerClient("localhost", 1080).verify( request() .withMethod("POST") .withPath("/validate") .withBody(exact("{username: 'foo', password: 'bar'}")), VerificationTimes.exactly(1) ); }

Di sini, kelas org.mockserver.verify.VerificationTimes digunakan untuk menentukan berapa kali Server Mock harus cocok dengan permintaan.

6. Kesimpulan

Dalam artikel singkat ini, kami telah menjelajahi berbagai fungsi MockServer. Kami juga telah menjelajahi berbagai API yang disediakan dan bagaimana API tersebut dapat digunakan untuk menguji sistem yang kompleks.

Seperti biasa, kode lengkap untuk artikel ini tersedia di GitHub.