מבוא ל- WireMock

1. סקירה כללית

WireMock הינה ספרייה לניקוי וללעג שירותי אינטרנט. הוא בונה שרת HTTP שנוכל להתחבר אליו כמו שהיינו עושים לשירות אינטרנט בפועל.

כאשר שרת WireMock פועל, אנו יכולים להגדיר ציפיות, להתקשר לשירות ואז לאמת את התנהגויותיו.

2. תלות Maven

על מנת שנוכל לנצל את ספריית WireMock, עלינו לכלול את התלות הבאה ב- POM:

 com.github.tomakehurst wiremock 1.58 test 

3. שרת מנוהל בתכנות

סעיף זה יכסה את הדרך להגדרת תצורה ידנית של שרת WireMock. כלומר ללא תמיכה בתצורה אוטומטית של JUnit. השימוש מודגם על ידי תוף פשוט מאוד.

3.1. הגדרת שרת

ניתן לייצר שרת WireMock כך:

WireMockServer wireMockServer = WireMockServer חדש (מארח מחרוזות, יציאת int);

אם לא ניתנים טיעונים, ברירת המחדל של מארח השרת היא מארח מקומי ויציאת השרת אל 8080.

לאחר מכן ניתן להפעיל ולהפסיק את השרת בשתי שיטות פשוטות:

wireMockServer.start ();

וגם:

wireMockServer.stop ();

3.2. שימוש בסיסי

ראשית, הספרייה של WireMock תודגם על ידי שימוש בסיסי, שם ניתן תור לכתובת אתר מדויקת ללא כל תצורה נוספת. בוא ניצור מופע שרת:

WireMockServer wireMockServer = WireMockServer חדש ();

שרת WireMock חייב לפעול לפני שהלקוח יתחבר אליו:

wireMockServer.start ();

שירות האינטרנט נשלח לאחר מכן:

configureFor ("localhost", 8080); stubFor (get (urlEqualTo ("/ baeldung")). willReturn (aResponse (). withBody ("ברוך הבא לבלדונג!"));

הדרכה זו עושה שימוש בממשק ה- API של Apache HttpClient כדי לייצג לקוח שמתחבר לשרת:

CloseableHttpClient httpClient = HttpClients.createDefault ();

בקשה מבוצעת ותגובה מוחזרת בהתאמה, לאחר מכן:

HttpGet בקשה = HttpGet חדש ("// localhost: 8080 / baeldung"); HttpResponse httpResponse = httpClient.execute (בקשה);

אנו להמיר את http תגובה משתנה ל- a חוּט בשיטת עוזר:

מחרוזת responseString = convertResponseToString (httpResponse);

להלן יישום שיטת עוזר ההמרות ההיא:

מחרוזת פרטית convertResponseToString (תגובה HttpResponse) זורק IOException {InputStream responseStream = respons.getEntity (). getContent (); סורק סורק = סורק חדש (responseStream, "UTF-8"); מחרוזת responseString = scanner.useDelimiter ("\ Z"). הבא (); scanner.close (); תגובה תגובה מחרוזת; }

הקוד הבא מאמת שהשרת קיבל בקשה לכתובת האתר הצפויה והתגובה שהגיעה ללקוח היא בדיוק מה שנשלח:

אמת (getRequestedFor (urlEqualTo ("/ baeldung"))); assertEquals ("ברוך הבא לבלדונג!", stringResponse);

לבסוף, יש להפסיק את שרת WireMock כדי לשחרר משאבי מערכת:

wireMockServer.stop ();

4. שרת JUnit Managed

בניגוד לסעיף 3, סעיף זה ממחיש את השימוש בשרת WireMock בעזרת JUnit כְּלָל.

4.1. הגדרת שרת

ניתן לשלב שרת WireMock במקרי בדיקה של JUnit באמצעות ה- @כְּלָל ביאור. זה מאפשר ל- JUnit לנהל את מחזור החיים, להפעיל את השרת לפני כל שיטת בדיקה ולעצור אותו לאחר חזרת השיטה.

בדומה לשרת המנוהל באמצעות תכנות, ניתן ליצור שרת WireMock מנוהל על ידי JUnit כאובייקט Java עם מספר היציאה הנתון:

@Rule WireMockRule ציבורי wireMockRule = WireMockRule חדש (יציאת int);

אם לא סופקו ארגומנטים, יציאת השרת תיקח את ערך ברירת המחדל, 8080. מארח שרת, ברירת המחדל היא מארח מקומיותצורות אחרות ניתן לציין באמצעות אפשרויות מִמְשָׁק.

4.2. התאמת כתובות אתרים

לאחר הקמת א WireMockRule למשל, השלב הבא הוא להגדיר תוף. בסעיף קטן זה, אנו נספק RUB עבור נקודת קצה של שירות באמצעות ביטוי רגיל:

stubFor (get (urlPathMatching ("/ baeldung /.*")) .willReturn (aResponse () .withStatus (200) .withHeader ("Type-Type", "application / json") .withBody ("\" testing-library \ ": \" WireMock \ "")));

נעבור ליצירת לקוח HTTP, ביצוע בקשה ונקבל תשובה:

CloseableHttpClient httpClient = HttpClients.createDefault (); HttpGet בקשה = HttpGet חדש ("// localhost: 8080 / baeldung / wiremock"); HttpResponse httpResponse = httpClient.execute (בקשה); מחרוזת stringResponse = convertHttpResponseToString (httpResponse);

קטע הקוד לעיל מנצל שיטת עוזר להמרה:

מחרוזת פרטית convertHttpResponseToString (HttpResponse httpResponse) זורק IOException {InputStream inputStream = httpResponse.getEntity (). getContent (); להחזיר convertInputStreamToString (inputStream); }

זה בתורו עושה שימוש בשיטה פרטית אחרת:

מחרוזת פרטית convertInputStreamToString (InputStream inputStream) {סורק סורק = סורק חדש (inputStream, "UTF-8"); מחרוזת מחרוזת = scanner.useDelimiter ("\ Z"). הבא (); scanner.close (); מחרוזת החזרה; }

פעולות הבד מאומתות על ידי קוד הבדיקה שלהלן:

אמת (getRequestedFor (urlEqualTo ("/ baeldung / wiremock")); assertEquals (200, httpResponse.getStatusLine (). getStatusCode ()); assertEquals ("application / json", httpResponse.getFirstHeader ("סוג תוכן"). getValue ()); assertEquals ("\" testing-library \ ": \" WireMock \ "", stringResponse);

4.3. בקש התאמת כותרת

כעת נדגים כיצד לדחוף REST API עם התאמת כותרות. נתחיל בתצורת הבקעה:

stubFor (get (urlPathEqualTo ("/ baeldung / wiremock")) .withHeader ("Accept", matching ("text /.*")) .willReturn (aResponse () .withStatus (503) .withHeader ("Type Content") , "text / html") .withBody ("!!! שירות לא זמין !!!")));

בדומה לסעיף המשנה הקודם, אנו ממחישים אינטראקציה של HTTP באמצעות ממשק ה- API של HttpClient, בעזרת אותן שיטות עוזרות:

CloseableHttpClient httpClient = HttpClients.createDefault (); HttpGet בקשה = HttpGet חדש ("// localhost: 8080 / baeldung / wiremock"); request.addHeader ("קבל", "טקסט / HTML"); HttpResponse httpResponse = httpClient.execute (בקשה); מחרוזת stringResponse = convertHttpResponseToString (httpResponse);

האימות והטענות הבאים מאשרים את הפונקציות של הבד שיצרנו קודם:

אמת (getRequestedFor (urlEqualTo ("/ baeldung / wiremock"))); assertEquals (503, httpResponse.getStatusLine (). getStatusCode ()); assertEquals ("text / html", httpResponse.getFirstHeader ("סוג תוכן"). getValue ()); assertEquals ("!!! שירות לא זמין !!!", stringResponse);

4.4. בקש התאמת גוף

ניתן להשתמש בספריית WireMock גם כדי לדחוף REST API עם התאמת גוף. הנה התצורה עבור תוף מסוג זה:

stubFor (post (urlEqualTo ("/ baeldung / wiremock")) .withHeader ("Type-Content", equalTo ("application / json")) .withRequestBody (המכיל ("\" testing-library \ ": \" WireMock \ "")) .withRequestBody (המכיל ("\" יוצר \ ": \" טום אקהרסט \ "")) .withRequestBody (המכיל ("\" אתר \ ": \" wiremock.org \ "")) .willReturn ( aResponse () .withStatus (200)));

עכשיו הגיע הזמן ליצור StringEntity אובייקט שישמש כגוף הבקשה:

InputStream jsonInputStream = this.getClass (). GetClassLoader (). GetResourceAsStream ("wiremock_intro.json"); מחרוזת jsonString = convertInputStreamToString (jsonInputStream); ישות StringEntity = StringEntity חדש (jsonString);

הקוד שלמעלה משתמש באחת משיטות העוזר להמרה שהוגדרו לפני, convertInputStreamToString.

הנה תוכן של wiremock_intro.json קובץ בשביל הכיתה:

{"testing-library": "WireMock", "creator": "Tom Akehurst", "website": "wiremock.org"}

ניתן להגדיר ולבצע בקשות ותגובות HTTP באופן הבא:

CloseableHttpClient httpClient = HttpClients.createDefault (); HttpPost בקשה = HttpPost חדש ("// localhost: 8080 / baeldung / wiremock"); request.addHeader ("סוג תוכן", "יישום / json"); request.setEntity (ישות); תגובה HttpResponse = httpClient.execute (בקשה);

זהו קוד הבדיקה המשמש לאימות הדק:

אמת (postRequestedFor (urlEqualTo ("/ baeldung / wiremock")). withHeader ("סוג תוכן", equalTo ("יישום / json"))); assertEquals (200, response.getStatusLine (). getStatusCode ());

4.5. עדיפות בדל

סעיפי המשנה הקודמים עוסקים במצבים שבהם בקשת HTTP תואמת רק לדל יחיד. זה יהיה מסובך יותר אם יש יותר מהתאמה לבקשה. כברירת מחדל, המקנה האחרון שנוסף יקבל עדיפות במקרה כזה. עם זאת, משתמשים רשאים להתאים אישית את ההתנהגות הזו כדי להשתלט יותר על תומכי WireMock.

נדגים פעולות של שרת WireMock כאשר בקשה הקרובה תואמת שני ערוצים שונים, עם ובלי קביעת רמת העדיפות, בו זמנית. שני התרחישים ישתמשו בשיטת העוזר הפרטי הבאה:

פרטי HttpResponse generateClientAndReceiveResponseForPriorityTests () זורק IOException {CloseableHttpClient httpClient = HttpClients.createDefault (); HttpGet בקשה = HttpGet חדש ("// localhost: 8080 / baeldung / wiremock"); request.addHeader ("קבל", "טקסט / xml"); להחזיר httpClient.execute (בקשה); }

ראשית, הגדר שני תאים ללא התחשבות ברמת העדיפות:

stubFor (get (urlPathMatching ("/ baeldung /.*")) .willReturn (aResponse () .withStatus (200))); stubFor (get (urlPathEqualTo ("/ baeldung / wiremock")) .withHeader ("Accept", matching ("text /.*")) .willReturn (aResponse () .withStatus (503)));

לאחר מכן, צור לקוח HTTP ובצע בקשה בשיטת העוזר המתוארת לעיל:

HttpResponse httpResponse = createClientAndReceiveResponseForPriorityTests ();

קטע הקוד הבא מאמת שהדאבל שהוגדר לאחרונה מוחל ללא קשר לזה שהוגדר לפני כאשר בקשה תואמת את שניהם:

אמת (getRequestedFor (urlEqualTo ("/ baeldung / wiremock"))); assertEquals (503, httpResponse.getStatusLine (). getStatusCode ());

בואו נעבור לסטובים עם הגדרת רמות עדיפות, שם מספר נמוך יותר מייצג עדיפות גבוהה יותר:

stubFor (get (urlPathMatching ("/ baeldung /.*")) .atPriority (1) .willReturn (aResponse () .withStatus (200))); stubFor (get (urlPathEqualTo ("/ baeldung / wiremock")) .atPriority (2) .withHeader ("Accept", matching ("text /.*")) .willReturn (aResponse () .withStatus (503)));

יצירה וביצוע של בקשת HTTP:

HttpResponse httpResponse = createClientAndReceiveResponseForPriorityTests ();

הקוד הבא מאמת את ההשפעה של רמות העדיפות, שם מוחל הדום הראשון שהוגדר במקום האחרון:

אמת (getRequestedFor (urlEqualTo ("/ baeldung / wiremock")); assertEquals (200, httpResponse.getStatusLine (). getStatusCode ());

5. מסקנה

הדרכה זו הציגה את WireMock וכיצד להגדיר וכן להגדיר את הספרייה הזו לבדיקת REST APIs תוך שימוש בטכניקות שונות, כולל התאמת כתובת URL, כותרות בקשה וגוף.

ניתן למצוא את היישום של כל הדוגמאות וקטעי הקוד בפרויקט GitHub.


$config[zx-auto] not found$config[zx-overlay] not found