בדיקת יחידות של System.out.println () עם JUnit

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

בעת בדיקת יחידות אנו עשויים לרצות לבדוק את ההודעות שאנו כותבים לפלט רגיל באמצעות System.out.println ().

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

במדריך המהיר הזה, נבחן כמה דרכים בהן אנו יכולים לבדוק יחידות System.out.println () באמצעות JUnit.

2. שיטת הדפסה פשוטה

לאורך הדרכה זו, המוקד לבדיקות שלנו יהיה שיטה פשוטה הכותבת לזרם הפלט הסטנדרטי:

הדפסת חלל פרטית (פלט מחרוזת) {System.out.println (פלט); } 

תזכורת מהירה ש- הַחוּצָה משתנה הוא a סופי סטטי ציבורי PrintStream אובייקט המייצג את זרם הפלט הסטנדרטי המיועד לשימוש בכל המערכת.

3. עבודה עם Core Java

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

סופי פרטי PrintStream standardOut = System.out; גמר פרטי ByteArrayOutputStream outputStreamCaptor = ByteArrayOutputStream חדש (); @ לפני כל setUp ריק ריק () {System.setOut (PrintStream חדש (outputStreamCaptor)); }

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

@Test בטל givenSystemOutRedirection_whenInvokePrintln_thenOutputCaptorSuccess () {הדפס ("שלום קוראי באלדונג !!"); Assert.assertEquals ("שלום קוראי באלדונג !!", outputStreamCaptor.toString () .trim ()); }

אחרי שאנחנו קוראים הדפס בשיטה עם הטקסט שנבחר, נוכל לאמת שה- outputStreamCaptor מכיל את התוכן לו ציפינו. אנו קוראים מְטוּפָּח שיטה להסרת השורה החדשה ש System.out.println () מוסיף.

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

@AfterEach הריק הציבורי tearDown () {System.setOut (standardOut); }

זה מבטיח שלא נקבל תופעות לוואי לא רצויות בהמשך בבדיקות אחרות.

4. שימוש בכללי מערכת

בחלק הזה, אנו נסתכל על ספרייה חיצונית מסודרת בשם כללי מערכת המספקת סט של כללי JUnit לבדיקת קוד המשתמש ב- מערכת מעמד.

נתחיל בהוספת התלות שלנו pom.xml:

 com.github.stefanbirkner כללי מערכת 1.19.0 מבחן 

כעת, נוכל להמשיך ולכתוב מבחן באמצעות ה- SystemOutRule הספרייה מספקת:

@Rule הסופי הציבורי SystemOutRule systemOutRule = SystemOutRule חדש (). EnableLog (); @Test public void givenSystemOutRule_whenInvokePrintln_thenLogSuccess () {print ("שלום קוראי באלדונג !!"); Assert.assertEquals ("שלום קוראי באלדונג !!", systemOutRule.getLog () .trim ()); }

די מגניב! משתמש ב SystemOutRule, אנחנו יכולים ליירט את הכותבים ל System.out. ראשית, אנו מתחילים לרשום את כל מה שנכתב System.out על ידי קריאה ל אפשר לוג שיטה על הכלל שלנו. ואז אנחנו פשוט מתקשרים getLog כדי לכתוב את הטקסט System.out מאז שהתקשרנו אפשר לוג.

כלל זה כולל גם שיטה שימושית המחזירה יומן שתמיד יש בו מפריד השורות \ n

Assert.assertEquals ("שלום קוראי באלדונג !! \ n", systemOutRule.getLogWithNormalizedLineSeparator ());

5. שימוש בכללי מערכת עם JUnit5 ו- Lambdas

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

מערכת למבדה זמינה ממייבן סנטרל. כדי שנוכל להמשיך ולהוסיף אותו ל pom.xml:

 com.github.stefanbirkner מערכת-למבה 1.0.0 מבחן 

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

@Test בטל givenTapSystemOut_whenInvokePrintln_thenOutputIsReturnedSuccessfully () זורק חריג {טקסט מחרוזת = tapSystemOut (() -> {הדפס ("שלום קוראי באלדונג !!");}); Assert.assertEquals ("שלום קוראי באלדונג !!", text.trim ()); }

בגרסה זו, אנו משתמשים ב- tapSystemOut השיטה, שמבצעת את ההצהרה ומאפשרת לנו לתפוס את התוכן שעבר System.out.

6. מסקנה

במדריך זה למדנו על כמה גישות לבדיקה System.out.println. בגישה הראשונה ראינו כיצד להפנות מחדש לאן אנו כותבים את זרם הפלט הסטנדרטי באמצעות Java הליבה.

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

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