Ruganje datotečnom sustavu s Jimfs-om

1. Pregled

Tipično, prilikom testiranja komponenata koje intenzivno koriste I / O operacije, naši testovi mogu patiti od nekoliko problema kao što su loša izvedba, ovisnost o platformi i neočekivano stanje.

U ovom vodiču, pogledati ćemo kako možemo ublažiti te probleme pomoću datotečnog sustava u memoriji Jimfs.

2. Uvod u Jimfs

Jimfs je sustav datoteka u memoriji koji implementira Java NIO API i podržava gotovo sve njegove značajke. To je osobito korisno, jer znači da možemo oponašati virtualni sustav memorije datoteka i komunicirati s njim koristeći svoj postojeći java.nio sloj.

Kao što ćemo vidjeti, možda bi bilo korisno upotrijebiti izmijenjeni sustav datoteka umjesto pravog kako bi:

  • Izbjegavajte ovisnost o datotečnom sustavu koji trenutno izvodi test
  • Osigurajte da se datotečni sustav sastavi s očekivanim stanjem na svakom probnom pokretanju
  • Pomozite nam ubrzati testove

Budući da se datotečni sustavi znatno razlikuju, upotreba Jimfs-a također omogućuje lako testiranje s datotečnim sustavima različitih operativnih sustava.

3. Ovisnosti Mavena

Prije svega, dodajmo ovisnosti o projektu koje će nam trebati za naše primjere:

 com.google.jimfs jimfs 1.1 

Ovisnost jimfs sadrži sve što nam je potrebno kako bismo koristili naš ismijani datotečni sustav. Uz to, pisat ćemo testove pomoću JUnit5.

4. Jednostavno spremište datoteka

Počet ćemo definiranjem jednostavnog Spremište datoteka klasa koja implementira neke standardne CRUD operacije:

javna klasa FileRepository {void create (Path path, String fileName) {Path filePath = path.resolve (fileName); isprobajte {Files.createFile (filePath); } catch (IOException ex) {throw new Un CheckIOException (ex); }} Čitanje niza (Staza puta) {try {return new String (Files.readAllBytes (path)); } catch (IOException ex) {throw new Un CheckIOException (ex); }} Ažuriranje niza (Put puta, String newContent) {try {Files.write (put, newContent.getBytes ()); return newContent; } catch (IOException ex) {throw new Un CheckIOException (ex); }} void delete (Put puta) {try {Files.deleteIfExists (path); } catch (IOException ex) {throw new Un CheckIOException (ex); }}}

Kao što vidimo, svaka metoda koristi standard java.nio razreda.

4.1. Stvaranje datoteke

U ovom ćemo odjeljku napisati test koji testira stvoriti metoda iz našeg spremišta:

@Test @DisplayName ("Treba stvoriti datoteku u datotečnom sustavu") void givenUnixSystem_whenCreatingFile_thenCreatedInPath () {FileSystem fileSystem = Jimfs.newFileSystem (Configuration.unix ()); Niz datotekeName = "newFile.txt"; Put pathToStore = fileSystem.getPath (""); fileRepository.create (pathToStore, fileName); assertTrue (Files.exists (pathToStore.resolve (fileName))); }

U ovom smo primjeru koristili statički metoda Jimfs.newFileSystem () za stvaranje novog datotečnog sustava u memoriji. Prolazimo kroz konfiguracijski objekt Configuration.unix (), koji stvara nepromjenjivu konfiguraciju za Unix datotečni sustav. To uključuje važne informacije specifične za OS, poput separatora puta i informacije o simboličkim vezama.

Sad kad smo kreirali datoteku, možemo provjeriti je li datoteka uspješno stvorena u sustavu temeljenom na Unixu.

4.2. Čitanje datoteke

Zatim ćemo testirati metodu koja čita sadržaj datoteke:

@Test @DisplayName ("Treba pročitati sadržaj datoteke") void givenOSXSystem_whenReadingFile_thenContentIsReturned () baca izuzetak {FileSystem fileSystem = Jimfs.newFileSystem (Configuration.osX ()); Put resourceFilePath = fileSystem.getPath (RESOURCE_FILE_NAME); Files.copy (getResourceFilePath (), resourceFilePath); Sadržaj niza = fileRepository.read (resourceFilePath); assertEquals (FILE_CONTENT, sadržaj); }

Ovog smo puta provjerili je li moguće pročitati sadržaj datoteke na macOS (bivši OSX) sustav jednostavnim korištenjem drugačijeg tipa konfiguracije - Jimfs.newFileSystem (Configuration.osX ()).

4.3. Ažuriranje datoteke

Također možemo koristiti Jimfs za testiranje metode koja ažurira sadržaj datoteke:

@Test @DisplayName ("Treba ažurirati sadržaj datoteke") void givenWindowsSystem_whenUpdatingFile_thenContentHasChanged () baca izuzetak {FileSystem fileSystem = Jimfs.newFileSystem (Configuration.windows ()); Put resourceFilePath = fileSystem.getPath (RESOURCE_FILE_NAME); Files.copy (getResourceFilePath (), resourceFilePath); String newContent = "Ažuriram vas."; Sadržaj niza = fileRepository.update (resourceFilePath, newContent); assertEquals (newContent, content); assertEquals (newContent, fileRepository.read (resourceFilePath)); }

Isto tako, ovaj put smo provjerili kako se metoda ponaša na a Sustav zasnovan na sustavu Windows pomoću Jimfs.newFileSystem (Configuration.windows ()).

4.4. Brisanje datoteke

Da završimo testiranje naših CRUD operacija, testirajmo metodu koja briše datoteku:

@Test @DisplayName ("Treba izbrisati datoteku") void givenCurrentSystem_whenDeletingFile_thenFileHasBeenDeleted () baca izuzetak {FileSystem fileSystem = Jimfs.newFileSystem (); Put resourceFilePath = fileSystem.getPath (RESOURCE_FILE_NAME); Files.copy (getResourceFilePath (), resourceFilePath); fileRepository.delete (resourceFilePath); assertFalse (Files.exists (resourceFilePath)); }

Za razliku od prethodnih primjera, mi smo koristili Jimfs.newFileSystem () bez navođenja konfiguracije datotečnog sustava. U tom će slučaju Jimfs stvoriti novi datotečni sustav u memoriji sa zadanom konfiguracijom primjerenom trenutnom operativnom sustavu.

5. Premještanje datoteke

U ovom ćemo odjeljku naučiti kako testirati metodu koja premješta datoteku iz jednog direktorija u drugi.

Prvo, provedimo potez metoda koja koristi standard java.nio.file.File razred:

void move (ishodište puta, odredište puta) {try {Files.createDirectories (odredište); Files.move (ishodište, odredište, StandardCopyOption.REPLACE_EXISTING); } catch (IOException ex) {throw new Un CheckIOException (ex); }}

Upotrijebit ćemo parametarski test kako bismo osigurali da ova metoda radi na nekoliko različitih datotečnih sustava:

privatni statički Stream provideFileSystem () {return Stream.of (Arguments.of (Jimfs.newFileSystem (Configuration.unix ())), Arguments.of (Jimfs.newFileSystem (Configuration.windows ())), Arguments.of (Jimfs. newFileSystem (Configuration.osX ()))); } @ParameterizedTest @DisplayName ("Treba premjestiti datoteku na novo odredište") @MethodSource ("provideFileSystem") void givenEachSystem_whenMovingFile_thenMovedToNewPath (FileSystem fileSystem) baca iznimku {Path origin = fileSystem.getPath (RESOURCE_FILE) Files.copy (getResourceFilePath (), ishodište); Odredište puta = fileSystem.getPath ("newDirectory", RESOURCE_FILE_NAME); fileManipulation.move (podrijetlo, odredište); assertFalse (Files.exists (izvor)); assertTrue (Files.exists (odredište)); }

Kao što vidimo, također smo mogli koristiti Jimfs da testiramo možemo li premještati datoteke na raznim sustavima datoteka iz jednog jediničnog testa.

6. Testovi ovisni o operativnom sustavu

Da bismo demonstrirali još jednu korist korištenja Jimfova, stvorimo a FilePathReader razred. Klasa je odgovorna za vraćanje stvarnog puta sustava, koji naravno ovisi o OS-u:

klasa FilePathReader {String getSystemPath (Put puta) {try {return path .toRealPath () .toString (); } catch (IOException ex) {throw new Un CheckIOException (ex); }}}

Dodajmo test za ovu klasu:

klasa FilePathReaderUnitTest {privatni statički niz DIRECTORY_NAME = "baeldung"; private FilePathReader filePathReader = novi FilePathReader (); @Test @DisplayName ("Should get path on windows") void givenWindowsSystem_shouldGetPath_thenReturnWindowsPath () baca izuzetak {FileSystem fileSystem = Jimfs.newFileSystem (Configuration.windows ()); Put puta = getPathToFile (fileSystem); Niz stringPath = filePathReader.getSystemPath (put); assertEquals ("C: \ work \" + DIRECTORY_NAME, stringPath); } @Test @DisplayName ("Treba dobiti put na unixu") void givenUnixSystem_shouldGetPath_thenReturnUnixPath () baca iznimku {FileSystem fileSystem = Jimfs.newFileSystem (Configuration.unix ()); Put puta = getPathToFile (fileSystem); Niz stringPath = filePathReader.getSystemPath (put); assertEquals ("/ work /" + DIRECTORY_NAME, stringPath); } private Path getPathToFile (FileSystem fileSystem) baca iznimku {Path path = fileSystem.getPath (DIRECTORY_NAME); Files.createDirectory (put); povratni put; }}

Kao što vidimo, izlaz za Windows razlikuje se od onoga u Unixu, kao što bismo i očekivali. Štoviše, nismo morali izvoditi ove testove pomoću dva različita datotečna sustava - Jimfs nam se automatski rugao.

Vrijedno je to spomenuti Jimfs ne podržava toFile () metoda koja vraća a java.io.Datoteka. To je jedina metoda iz Staza razred koji nije podržan. Stoga bi moglo biti bolje operirati InputStream nego a Datoteka.

7. Zaključak

U ovom smo članku naučili kako se koristiti sustavom datoteka u memoriji Jimfs za ruganje interakcijama datotečnog sustava iz naših jediničnih testova.

Prvo smo započeli definiranjem jednostavnog spremišta datoteka s nekoliko CRUD operacija. Tada smo vidjeli primjere kako testirati svaku od metoda koristeći drugu vrstu datotečnog sustava. Konačno, vidjeli smo primjer kako možemo koristiti Jimfs za testiranje rukovanja datotečnim sustavom ovisnim o OS-u.

Kao i uvijek, kod za ove primjere dostupan je na Githubu.


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