Junit - mock-Datei
Ich versuche, die Abdeckung code, der eine Datei. Ich versuche zu vermeiden, mit real-Datei, die für die tests, so dass ich mit Mockito.
Dies ist der code, den ich versuche zu testen:
try {
byte[] data = Files.readAllBytes(((File) body).toPath());
immutableBody = data;
actualHeaderParams.put(HttpHeaders.CONTENT_LENGTH, (new Integer(data.length)).toString());
contentType = MediaType.APPLICATION_OCTET_STREAM;
}
Ich bin mit mock-Datei:
File mockedFile = Mockito.mock(File.class);
aber ich bekomme eine Exception auf 'toPath'. Also ich habe einen Pfad oder eine null ist, aber dann wieder ich bekomme Ausnahmen, da die Datei nicht existiert, wird der Pfad.
when(mockedFile.toPath()).thenReturn(Paths.get("test.txt"));
immer:
com.http.ApiException: There was a problem reading the file: test.txt
Gibt es eine Möglichkeit, es zu tun, ohne eine echte Datei für den test?
- Finden Sie einen Weg, um pass in die Inhalte und externalisieren die Tatsache, dass Sie geschehen, es zu Lesen aus einer Datei. Ändern Sie die Signatur der Methode zum verschieben der Quelle von bytes aus.
- Es ist in der Regel einfacher zu benutzen Sie einfach
@Rule public TemporaryFolder folder = new TemporaryFolder()
und erstellen Sie einfach die "falschen" Inhalt der Datei, die Sie brauchen. Mocking-Dateien können schmerzhaft wirklich schnell.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da Sie zu verspotten Lesen von Dateien, ich nehme an, Sie haben eine gewisse Logik in dieser Klasse, die Sie möchten, um zu testen in isolation (ohne eigentlichen Dateien), daher schlage ich vor:
Verschieben der Verantwortung-Lesen von Dateien in einer separaten Klasse, also anstatt:
interleaved mit Ihrer business-Logik haben:
sowie
fileReader
wird eine Instanz der Klasse mit einer sehr einfachen Umsetzung entlang dieser Linien:dann in Ihrem test können Sie ersetzt
fileReader
mit einem Modell, auf dem Sie festlegen können, die Erwartungen.Wenn Sie der Verwendung von Java 8 Sie müssen nicht erstellen die
FileToBytesReader
Klasse, aber Sie könnenjava.util.Function
:BTW. Wenn Sie eine legacy-code und Sie können nicht ändern, die Produktion code, dann müssen Sie verwenden, PowerMock, zu verhöhnen, ist diese statische Methode.
Ich bin nicht sicher, es ist ein einfacher Weg, aber ich könnte falsch sein. Sie würden wahrscheinlich benötigen, um zu verspotten die statischen Dateien.readAllBytes () - Methode, die Sie verwenden müssen, um so etwas wie PowerMock zu tun. Oder Sie wickeln konnte dies in einer Methode, die können Sie dann verspotten das Verhalten:
haben und dann ein mock für diese Methode:
Mock-Dateien.readAllBytes() mit Matcher.jede() als Argumente. und liefert ein byte-array.