Ich führe Tests in einem Projekt ein, das E / A-Operationen (in diesem Fall das Dateisystem) stark nutzt. Das System öffnet / schließt ständig Dateien, prüft, ob Dateien vorhanden sind, löscht sie usw.
Es wurde schnell klar, dass regelmäßiges Verspotten nicht viel nützen würde, da dies meine Tests schwer einzurichten und zu begründen machen würde. Auf der anderen Seite wäre es fantastisch, ein gefälschtes Dateisystem zu haben, und ich denke, es ist ziemlich einfach einzurichten.
Es scheint, dass die Ruby-Jungs es wieder getan haben, und es gibt genau das, wonach ich in Ruby frage : http://ozmm.org/posts/fakefs.html .
Gibt es etwas Ähnliches für Java?
java
unit-testing
testing
mocking
verschlungenes Elysium
quelle
quelle
Antworten:
Google verfügt über eine Open-Source-In-Memory-Implementierung des FileSystemProvider von Java 7. Das Projekt heißt jimfs .
Wenn Sie Java 6 oder früher verwenden, gibt es eine Alternative: Ich habe Apache Commons VFS bereits mit großem Erfolg verwendet. Es scheint dem benutzerdefinierten FileSystemProvider, der in Java 7 erwähnt wird, sehr ähnlich zu sein.
Es ist mit mehreren Dateisystemimplementierungen vorinstalliert : Datei, RAM, S / FTP und Jar, um nur einige zu nennen. Ich habe auch ein Plugin für S3 gesehen .
quelle
Path
versehentlich verwendet)In Java 6 und früheren Versionen ist dies schwierig, da Klassen den Versand an verschiedene "virtuelle Dateisysteme" im Java-Bereich mögen
File
undFileInputStream
nicht ermöglichen.In Java 7 werden virtuelle Dateisysteme unterstützt. Siehe Entwickeln eines benutzerdefinierten Dateisystemanbieters . Ich weiß nicht, ob Sie damit tun können, was Sie wollen, aber es ist ein guter Ort, um zu suchen.
Tatsächlich gewinnen Sie mit FileSystemProvider:
Sie implementieren etwas, das (wenn es unter einer Open Source-Lizenz veröffentlicht wird) für andere Personen in Ihrer Position und für andere Zwecke sehr nützlich sein kann.
Sie machen es sich leichter, wenn Sie zu einem FileSystemProvider wechseln, an dem gerade jemand anderes arbeitet.
quelle
Sie können
org.junit.rules.TemporaryFolder
aus dem JUnit- Paket verwenden:Beispiel:
Alternativ können Sie das
.toPath()
Teil beenden :quelle
Sie können die Verwendung von abstrahieren,
File
indem Sie die Absicht verwenden, "irgendwo Daten zu schreiben", indem Sie Ihre API so ändern, dass sie aOutputStream
anstelle von a verwendetFile
, und dann die API aFileOutputStream
in Ihrem Produktionscode übergeben, aber aByteArrayOutputStream
aus Ihren Tests übergeben. AByteArrayOutputStream
ist ein In-Memory-Stream, daher ist er sehr schnell und Sie können seinen Inhalt einfach mithilfe seiner Methoden überprüfen - er eignet sich perfekt zum Testen. Es gibt auch die entsprechenden,ByteArrayInputStream
wenn Sie Daten lesen möchten .Dateisysteme sind im Allgemeinen ziemlich schnell - wenn Sie in Ihren Tests nicht viel Datei-E / A ausgeführt haben, würde ich mich nicht darum kümmern.
Beachten Sie, dass eine Java - Erstellung
File
Objekts nicht eine Datei auf der Festplatte erstellen, dh der folgende Code verursacht keine Änderung auf der Festplatte:quelle
new File("xyz").getAbsolutePath()
macht absolut nichts, außer den Pfad zurückzugeben, den die Datei haben würde , wenn sie existieren würde. Das Dateisystem wird nicht geändert. Wenn die Datei nicht vorhanden ist, gibt sie dennoch die Zeichenfolge des Pfads zurück und erstellt keine Datei. Was meinten Sie mit "sehen, was passiert"?File
ist nicht endgültig in meinem OpenJDK 7.Jimfs von Google ist ein In-Memory-NIO-Dateisystem, das sich hervorragend für Tests eignet.
quelle
Eine einfache Möglichkeit wäre, die Methode Ihres Systems zu verwenden, um ein Dateisystem bereitzustellen , das vollständig auf RAM basiert - tempfs unter Linux, eine RAM-Disk unter Windows.
quelle
MockFTPServer scheint einige gefälschte Dateisystemimplementierungen zu haben (Unix / Windows)
Es sieht so aus, als könnten Sie diese gefälschten Dateisystemimplementierungen ganz getrennt von allen FTP-Konzepten verwenden. Ich versuche dies jetzt aus genau den gleichen Gründen, die Sie skizziert haben.
quelle
Ich bin mir nicht sicher über bestimmte Frameworks, aber ein allgemeiner Ansatz in Bezug auf OOP wäre, einige abstrahierte Ebenen über jeden Dateizugriffscode (Schnittstellen in Hülle und Fülle!) und möglicherweise eine Fassade zu schreiben, um die Verwendung gängiger Operationen zu vereinfachen. Dann verspotten Sie nur eine Ebene unter dem Code, den Sie gerade testen, und es handelt sich dann im Wesentlichen um ein gefälschtes Dateisystem (oder zumindest der Code, den Sie testen, weiß nichts anderes).
Wenn Sie ein Abhängigkeitsinjektionsframework verwenden möchten, um dies für Sie zu erledigen, wird es die Möglichkeit erleichtern, Komponenten für eine gefälschte Implementierung einer Schnittstelle auszutauschen. Wenn Sie den Mustern der Umkehrung der Steuerung folgen und Abhängigkeiten an den Konstruktor der Klasse übergeben, die Sie testen, wird dies auch zum einfachen Testen.
Ich hoffe, mein Java ist korrekt, ich habe Java schon lange nicht mehr geschrieben, aber Sie werden hoffentlich den Drift bekommen. hoffentlich unterschätze ich das Problem hier nicht und bin zu simpel!
Dies setzt natürlich voraus, dass Sie echte Unit-Tests meinen, dh das Testen der kleinstmöglichen Code-Einheiten und nicht eines ganzen Systems. Für Integrationstests ist ein anderer Ansatz erforderlich.
quelle
ShrinkWrap aus dem Arquillian-Projekt scheint ein NIO-kompatibles Speicher-Dateisystem zu enthalten
Sie können ein einfaches Dateisystem im Speicher erstellen, indem Sie folgende Schritte ausführen:
quelle
Zwei andere in Speicherdateisystemen für Java sind:
Speicher-Dateisystem
Ephemeralfs
Beide implementieren die NIO.2-Dateisystem-API.
quelle
Ich habe "Fake java FileSystem" gegoogelt und diese Frage gefunden. Leider ist das alles was ich gefunden habe. Also habe ich dieses gefälschte Dateisystem selbst geschrieben: https://github.com/dernasherbrezon/mockfs
Ich verwende es zur Simulation von IOExceptions beim Lesen / Schreiben in Dateien. Eine IOException kann beispielsweise aufgrund von "kein Speicherplatz" auftreten, was mit anderen Mitteln kaum zu simulieren ist.
quelle
Es ist ein bisschen alt und diese Lösung scheint nur Linux zu sein, aber es sieht gut aus https://www.google.co.il/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=tmpfs%20on% 20ubuntu
tmpfs ist ein speicherintern zugeordnetes Verzeichnis (Daten verschwinden beim Neustart). Nach dem Mounten können Daten in sie kopiert und aus dem Speicher bearbeitet werden.
quelle