2017-12-19 4 views
0

Was ist der beste Ansatz zum Schreiben eines Komponententests für eine Methode, die eine Datei liest.Unit Test für Methoden, die Dateien lesen

Soll ich die Datei so verspotten?

File dumpFile = Mockito.mock(File.class); 
Mockito.when(getDumpAsFile()).thenReturn(dumpFile); 

Methode Under Test

public List<String> getDumpAsList() { 
    CSVReader reader = null; 
    List<String> errors = new ArrayList<>(); 

    try { 
    File f = getDumpAsFile(); 
    reader = new CSVReader(f, "UTF-8"); 
    reader.setLinesToSkip(0); 
    reader.setFieldSeparator(new char[] {','}); 
    reader.setTextSeparator('"'); 

    while(reader.readNextLine()) { 
     String line = reader.getSourceLine(); 
     if (line != null && isErrorLine(line)) { 
     errors.add(line); 
     } 
    } 

    } catch (FileNotFoundException e) { 

    } catch (Exception e) { 
    throw new RuntimeException("Cannot extract dumped items", e); 

    } finally { 
    if (reader != null) { 
     reader.closeQuietly(); 
    } 
    } 

    return errors; 
}  
+0

Es gibt wenig Wert in einem Schein hier. Sie sollten mindestens eine tatsächliche Testdatei zum Parsen zurückgeben. – Makoto

+2

Geben Sie anstelle einer Datei aus getDumpAsFile() einen InputStream zurück. Auf diese Weise können Sie sich über diese Methode lustig machen und dafür sorgen, dass sie einen ByteArrayInputStream zurückgibt, der in Ihrem Test von einem hartcodierten Bytearray liest. –

+0

Kennzeichnung als ein Betrüger von [dieser älteren Frage] (https://Stackoverflow.com/q/17681708/1426891), die über 'Datei' mit Mockito spottet (d. H. Nicht) und was stattdessen zu tun ist. Kurz gesagt, Sie können es aufteilen, so dass der Test der schweren Einheiten mit Abstraktionen auf höherer Ebene wie InputStream oder Reader erfolgt, und Integrationstests können wie in der folgenden Antwort von _glyching_ geschehen. Lassen Sie mich wissen, ob dieses Q & A Ihr Problem nicht in gleicher Weise löst. –

Antwort

0

Sie JUnit verwenden könnten TemporaryFolder Regel (oder, bei Verwendung von JUnit5, seine equivalent extension) eine Eingabedatei für den Test (s) zu erstellen.

Sie würden dann lassen getDumpAsFile() diese Datei zurückgeben und Ihr Test würde für die Datei arbeiten, die Sie erstellt haben. Nach Beendigung des Tests wird JUnit den temporären Ordner verwerfen und dabei das Testprinzip der Selbsteindämmung einhalten.

Dies ist, denke ich, der Ansatz, der das tatsächliche Verhalten der getDumpAsList Methode am ehesten widerspiegelt.