מערכת קבצים הלעוגה עם ג'ימפס

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

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

במדריך זה, אנו נסתכל כיצד אנו יכולים להקל על בעיות אלה באמצעות מערכת הקבצים הזכורה Jimfs.

2. מבוא לג'ימפס

Jimfs היא מערכת קבצים בזיכרון המיישמת את ה- API של Java NIO ותומך כמעט בכל תכונה בו. זה שימושי במיוחד, מכיוון שזה אומר שאנחנו יכולים לחקות מערכת קבצים וירטואלית בזיכרון ולהתקשר איתה באמצעות הקיים שלנו java.nio שִׁכבָה.

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

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

מאחר שמערכות הקבצים משתנות במידה ניכרת, השימוש ב- Jimfs מאפשר גם בדיקות קלות עם מערכות קבצים ממערכות הפעלה שונות.

3. תלות Maven

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

 com.google.jimfs jimfs 1.1 

התלות של jimfs מכילה את כל מה שאנחנו צריכים על מנת להשתמש במערכת הקבצים הלעגנית שלנו. בנוסף, נכתוב מבחנים באמצעות JUnit5.

4. מאגר קבצים פשוט

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

מחלקה ציבורית FileRepository {void create (Path path, String fileName) {Path filePath = path.resolve (fileName); נסה את {Files.createFile (filePath); } לתפוס (IOException לשעבר) {לזרוק UncheckedIOException חדש (לשעבר); }} קריאת מחרוזת (נתיב נתיב) {נסה {להחזיר מחרוזת חדשה (Files.readAllBytes (נתיב)); } לתפוס (IOException לשעבר) {לזרוק UncheckedIOException חדש (לשעבר); }} עדכון מחרוזת (נתיב נתיב, מחרוזת newContent) {נסה את {Files.write (path, newContent.getBytes ()); החזר newContent; } לתפוס (IOException לשעבר) {לזרוק UncheckedIOException חדש (לשעבר); }} מחיקה בטלה (נתיב נתיב) {נסה {Files.deleteIfExists (נתיב); } לתפוס (IOException לשעבר) {לזרוק UncheckedIOException חדש (לשעבר); }}}

כפי שאנו רואים, כל שיטה עושה שימוש בתקן java.nio שיעורים.

4.1. יצירת קובץ

בחלק זה נכתוב מבחן הבודק את ה- לִיצוֹר מהמאגר שלנו:

@Test @DisplayName ("צריך ליצור קובץ במערכת קבצים") בטל givenUnixSystem_whenCreatingFile_thenCreatedInPath () {FileSystem fileSystem = Jimfs.newFileSystem (Configuration.unix ()); מחרוזת fileName = "newFile.txt"; נתיב pathToStore = fileSystem.getPath (""); fileRepository.create (pathToStore, fileName); assertTrue (Files.exists (pathToStore.resolve (fileName))); }

בדוגמה זו השתמשנו ב- סטָטִי שיטה Jimfs.newFileSystem () כדי ליצור מערכת קבצים חדשה בזיכרון. אנו מעבירים אובייקט תצורה Configuration.unix (), שיוצר תצורה בלתי ניתנת לשינוי עבור מערכת קבצים של יוניקס. זה כולל מידע חשוב ספציפי למערכת ההפעלה, כגון מפרידי נתיבים ומידע על קישורים סימבוליים.

כעת, לאחר שיצרנו קובץ, אנו יכולים לבדוק אם הקובץ נוצר בהצלחה במערכת מבוססת יוניקס.

4.2. קריאת קובץ

לאחר מכן נבדוק את השיטה שקוראת את תוכן הקובץ:

@Test @DisplayName ("צריך לקרוא את תוכן הקובץ") בטל נתון OSXSystem_whenReadingFile_thenContentIsReturned () זורק חריג {FileSystem fileSystem = Jimfs.newFileSystem (Configuration.osX ()); נתיב resourceFilePath = fileSystem.getPath (RESOURCE_FILE_NAME); Files.copy (getResourceFilePath (), resourceFilePath); תוכן מחרוזת = fileRepository.read (resourceFilePath); assertEquals (FILE_CONTENT, תוכן); }

הפעם בדקנו אם ניתן לקרוא את תוכן הקובץ ב- a מערכת macOS (לשעבר OSX) פשוט על ידי שימוש בתצורה מסוג אחר - Jimfs.newFileSystem (Configuration.osX ()).

4.3. עדכון קובץ

אנו יכולים גם להשתמש ב- Jimfs כדי לבדוק את השיטה המעדכנת את תוכן הקובץ:

@Test @DisplayName ("אמור לעדכן את תוכן הקובץ") בטל givenWindowsSystem_whenUpdatingFile_thenContentHasChanged () זורק חריג {FileSystem fileSystem = Jimfs.newFileSystem (Configuration.windows ()); נתיב resourceFilePath = fileSystem.getPath (RESOURCE_FILE_NAME); Files.copy (getResourceFilePath (), resourceFilePath); String newContent = "אני מעדכן אותך."; תוכן מחרוזת = fileRepository.update (resourceFilePath, newContent); assertEquals (newContent, content); assertEquals (newContent, fileRepository.read (resourceFilePath)); }

כמו כן, הפעם בדקנו כיצד מתנהגת השיטה ב- מערכת מבוססת Windows באמצעות Jimfs.newFileSystem (Configuration.windows ()).

4.4. מחיקת קובץ

לסיום בדיקת פעולות ה- CRUD שלנו, בואו לבדוק את השיטה שמוחקת את הקובץ:

@Test @DisplayName ("צריך למחוק קובץ") בטל givenCurrentSystem_whenDeletingFile_thenFileHasBeenDeleted () זורק חריג {FileSystem fileSystem = Jimfs.newFileSystem (); נתיב resourceFilePath = fileSystem.getPath (RESOURCE_FILE_NAME); Files.copy (getResourceFilePath (), resourceFilePath); fileRepository.delete (resourceFilePath); assertFalse (Files.exists (resourceFilePath)); }

שלא כמו דוגמאות קודמות, השתמשנו Jimfs.newFileSystem () מבלי לציין תצורת מערכת קבצים. במקרה זה, ג'ימפס ייצור מערכת קבצים בזיכרון חדשה עם תצורת ברירת מחדל המתאימה למערכת ההפעלה הנוכחית.

5. העברת קובץ

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

ראשית, בואו ליישם את מהלך \ לזוז \ לעבור שיטה תוך שימוש בתקן java.nio.file.File מעמד:

מהלך ריק (מקור נתיב, יעד נתיב) {נסה {Files.createDirectories (יעד); Files.move (מקור, יעד, StandardCopyOption.REPLACE_EXISTING); } לתפוס (IOException לשעבר) {לזרוק UncheckedIOException חדש (לשעבר); }}

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

זרם סטטי פרטי provideFileSystem () {return Stream.of (Arguments.of (Jimfs.newFileSystem (Configuration.unix ())), Arguments.of (Jimfs.newFileSystem (Configuration.windows ())), Arguments.of (Jimfs. newFileSystem (Configuration.osX ()))); } @ParameterizedTest @DisplayName ("צריך להעביר את הקובץ ליעד חדש") @MethodSource ("supplyFileSystem") בטל givenEachSystem_whenMovingFile_thenMovedToNewPath (FileSystem fileSystem) זורק חריג {Path origin = fileSystem.getPath (RESOURCE_FILE_NAME); Files.copy (getResourceFilePath (), מקור); יעד נתיב = fileSystem.getPath ("newDirectory", RESOURCE_FILE_NAME); fileManipulation.move (מקור, יעד); assertFalse (Files.exists (מקור)); assertTrue (Files.exists (יעד)); }

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

6. בדיקות תלויות במערכת ההפעלה

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

מחלקה FilePathReader {String getSystemPath (Path path) {נסה {return path .toRealPath () .toString (); } לתפוס (IOException לשעבר) {לזרוק UncheckedIOException חדש (לשעבר); }}}

כעת, בואו נוסיף מבחן לשיעור זה:

class FilePathReaderUnitTest {מחרוזת סטטית פרטית DIRECTORY_NAME = "baeldung"; FilePathReader פרטי filePathReader = FilePathReader חדש (); @Test @DisplayName ("אמור לעבור נתיב בחלונות") בטל givenWindowsSystem_shouldGetPath_thenReturnWindowsPath () זורק חריג {FileSystem fileSystem = Jimfs.newFileSystem (Configuration.windows ()); נתיב נתיב = getPathToFile (fileSystem); מחרוזת stringPath = filePathReader.getSystemPath (נתיב); assertEquals ("C: \ work \" + DIRECTORY_NAME, stringPath); } @Test @DisplayName ("צריך להגיע לנתיב ב- unix") ריק נתוןUnixSystem_shouldGetPath_thenReturnUnixPath () זורק חריג {FileSystem fileSystem = Jimfs.newFileSystem (Configuration.unix ()); נתיב נתיב = getPathToFile (fileSystem); String stringPath = filePathReader.getSystemPath (path); assertEquals ("/ work /" + DIRECTORY_NAME, stringPath); } נתיב פרטי getPathToFile (FileSystem fileSystem) זורק חריג {Path path = fileSystem.getPath (DIRECTORY_NAME); Files.createDirectory (נתיב); דרך חזרה; }}

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

ראוי להזכיר זאת ג'ימפס לא תומך ב לתייק() שיטה המחזירה א java.io. קובץ. זו השיטה היחידה מה- נָתִיב כיתה שאינה נתמכת. לכן אולי עדיף לנתח מכשיר InputStream ולא א קוֹבֶץ.

7. מסקנה

במאמר זה למדנו כיצד להשתמש במערכת הקבצים בזימף Jimfs כדי ללעוג לאינטראקציות של מערכת הקבצים ממבחני היחידות שלנו.

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

כמו תמיד, הקוד עבור דוגמאות אלה זמין ב- Github.


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