לועגים למתקן מנוחה באביב

1. הקדמה

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

אניבהדרכה מהירה זו, נבחן רק כמה דרכים ללעוג לשיחות כאלה המבוצעות רק באמצעות א RestTemplate.

נתחיל לבדוק עם Mockito, ספריית לעג פופולרית. לאחר מכן נשתמש ב- Spring Test המספק לנו מנגנון ליצירת שרת מדומה להגדרת האינטראקציות בין השרתים.

2. שימוש מוקיטו

נוכל להשתמש במוקיטו ללעוג ל RestTemplate לְגַמרֵי. בעזרת גישה זו, בדיקת השירות שלנו תהיה פשוטה כמו כל בדיקה אחרת הכוללת לעג.

נניח, יש לנו פשוט שירות עובדים בכיתה, שמביא פרטי עובד באמצעות HTTP:

מחלקה ציבורית @Service EmployeeService {@ RestTemplate פרטי RestoTemplate; עובד ציבורי getEmployee (מחרוזת מזהה) {ResponseEntity resp = restTemplate.getForEntity ("// localhost: 8080 / עובד /" + id, Employee.class); להחזיר resp.getStatusCode () == HttpStatus.OK? resp.getBody (): null; }} 

בואו ליישם את הבדיקה שלנו לקוד הקודם:

@RunWith (MockitoJUnitRunner.class) שכבה ציבורית EmployeeServiceTest {@Mock פרטי RestTemplate restTemplate; @InjectMocks EmployeeService פרטי empService = EmployeeService חדש (); @ מבחן ציבורי בטל givenMockingIsDoneByMockito_whenGetIsCalled_shouldReturnMockedObject () {עובד עובד = עובד חדש ("E001", "אריק סימונס"); Mockito .when (restTemplate.getForEntity ("// localhost: 8080 / עובד / E001", שכיר עובד)) .thenReturn (ResponseEntity חדש (emp, HttpStatus.OK)); עובד שכיר = empService.getEmployee (id); Assert.assertEquals (emp, עובד); }}

בשיעור הבדיקה של JUnit הנ"ל, ביקשנו תחילה ממוקיטו ליצור דמה RestTemplate שימוש למשל @לִלְעוֹג ביאור.

לאחר מכן, הערנו את ה- שירות עובדים מופע עם @InjectMocks להזרים את המופע הדמה לתוכו.

לבסוף, בשיטת הבדיקה הגדרנו את התנהגות הלעג שלנו באמצעות תמיכה של Mockito כאשר / אז.

3. שימוש במבחן אביב

המודול Spring Test כולל שרת מדומה בשם MockRestServiceServer.עם גישה זו, אנו מגדירים את השרת להחזיר אובייקט מסוים כאשר בקשה ספציפית נשלחת באמצעות שלנו RestTemplate למשל. לבסוף, אנחנו יכולים תאשר() במופע שרת זה, אם כל הציפיות נענו או לא.

MockRestServiceServer למעשה עובד על ידי יירוט שיחות ה- API של HTTP באמצעות a MockClientHttpRequestFactory. בהתבסס על התצורה שלנו, הוא יוצר רשימה של בקשות צפויות ותגובות מתאימות. כאשר RestTemplate למשל קורא API, הוא מחפש את הבקשה ברשימת הציפיות ומחזיר את התגובה המתאימה.

לפיכך, זה מבטל את הצורך בהפעלת שרת HTTP בכל יציאה אחרת לשליחת תגובות מדומות.

בואו ניצור מבחן פשוט לאותו דבר getEmployee () דוגמה לשימוש MockRestServiceServer:

@RunWith (SpringRunner.class) @ContextConfiguration (מחלקות = SpringTestConfig.class) מחלקה ציבורית EmployeeServiceMockRestServiceServerUnitTest {@ EmployeeService פרטית אוטומטית empService; @Autowired פרטי RestTemplate restTemplate; פרטי MockRestServiceServer mockServer; ממפה פרטי ObjectMapper = ObjectMapper חדש (); @ לפני init בטל פומבי () {mockServer = MockRestServiceServer.createServer (restTemplate); } @Test הציבור בטל givenMockingIsDoneByMockRestServiceServer_whenGetIsCalled_thenReturnsMockedObject () () {עובד emp = עובד חדש ("E001", "אריק סימונס"); mockServer.expect (ExpectedCount.once (), requestTo (URI חדש ("// localhost: 8080 / עובד / E001")) .andExpect (שיטה (HttpMethod.GET)). andRespond (withStatus (HttpStatus.OK) .contentType (MediaType.APPLICATION_JSON). גוף (mapper.writeValueAsString (emp))); עובד שכיר = empService.getEmployee (id); mockServer.verify (); Assert.assertEquals (emp, עובד); }} 

בקטע הקודם השתמשנו בשיטות סטטיות מ- in MockRestRequestMatchers ו MockRestResponseCreators להגדיר את הציפייה והתגובה לשיחת REST בצורה ברורה וקריאה:

ייבא org.springframework.test.web.client.match.MockRestRequestMatchers סטטי. *; ייבא org.springframework.test.web.client.response.MockRestResponseCreators סטטי. *;

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

@Bean ציבורי RestTemplate restTemplate () {להחזיר RestTemplate חדש (); }

באמצעות א MockRestServiceServer מאוד שימושי כשאנחנו כותבים את מבחני האינטגרציה שלנו ורק צריך ללעוג לשיחות HTTP חיצוניות.

4. מסקנה

במאמר קצר זה דנו בכמה אפשרויות יעילות ללעוג לשיחות ה- REST API החיצוניות באמצעות HTTP תוך כדי כתיבת בדיקות יחידות.

קוד המקור של המאמר לעיל זמין באתר GitHub.


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