2017-08-08 1 views
0

Ich habe eine Methode, die aus einer TXT-Datei lesen und eine Liste mit Wörtern füllen, die in der Datei vorhanden sind. Die Methode berechnet und gibt Most Repeated Word zurück. Wenn ich eine jUnit dafür schreiben möchte. Wie sollte ich die Corectess dieser Methode testen, da die Datei sich häufig ändert?jUnit für Dateileser

+0

Um zu testen, wissen Sie vielleicht die Anzahl des Auftretens der am häufigsten wiederholten Wort, wenn nicht können Sie nicht, also wenn die Datei ändern ist es schwierig ^^ – azro

Antwort

0

Wie @jaibalaji schrieb, sollten JuintTests nicht von Ressourcen außerhalb des JVM-Speichers abhängig sein.

Also der erste Schritt muss sein, Ihre Code im Test (Schnitt) unabhängig von der eigentlichen Datei.

Ich habe eine Methode, die aus einer TXT-Datei lesen und eine Liste mit Wörtern füllen, die in der Datei vorhanden sind. Die Methode berechnet und gibt Most Repeated Word zurück.

In dieser Sätze erwähnen Sie 3 Aufgaben:

  1. eine Datei
  2. bevölkern eine Liste
  3. Wort

wiederholten Lektüre sollten Sie diese Methode aufgespalten, so dass Sie mit kleineren Klassen mit jeweils nur einer Verantwortung.

Klasse TextAnalyser { private final WordListBulder wordListBulder; // konvertiert String in eine Liste von Wörtern private final WordCountAnalyser wordCountAnalyser; öffentlicher TextAnalyser (WordListBulder wordListBulder, WordCountAnalyser wordCountAnalyser) { this.wordListBulder = wordListBulder; this.wordCountAnalyser = wordCountAnalyser; }

public String findMostRepeatedWordIn(MyFileReader myFileReader){ 
    String fileContent = myFileReader.readContent(); 
    List<String> wordList = wordListBulder.crerateWordListFrom(fileContent); 
    return wordCountAnalyser.findMostRepeatedWordIn(wordList); 
} 

Dieser Code ist zu einfach zum Scheitern verurteilt und müssen nicht UnitTested sein. Modul- und/oder Acceptance-Tests wird zeigen, dass dies funktioniert.

Jetzt ist das Verhalten zu testen in der Klasse WordCountAnalyser. Und es hat eine einfache "falsche" Eingabe, die zu einer deterministischen testbaren Ausgabe führt.

0

Die Datei sollte ein Parameter der Methode oder ein Instanzfeld der Klasse dieser Methode sein.
Auf diese Weise können Sie die Methode testen, indem Sie eine Datei zur Verfügung stellen, mit der Sie die Daten verwalten und wissen, wie Sie sie anwenden.

Zum Beispiel mit dem Parameter Art und Weise:

public String findMostRepeatedWork(File file){ 
    ...  
} 

Und so kann man Einheit es leicht:

@Test 
public void findMostRepeatedWork(){ 
    // fixture 
    File myTestFile = ...; 
    // action 
    new MyClassToTest.findMostRepeatedWork(myTestFile); 
    // assertion 
    ... 
} 
+0

Es sollte einen Schritt weiter sein: Die 'BufferedReader' oder' InputStream' sollte sein die Klassen * Abhängigkeit *, so dass wir ** Mocks ** dieser Schnittstellen erstellen können und Dateisystem nicht berühren müssen ... –

+0

Ich habe die Methode geschrieben, die mostRepeatedWord zurückgibt. Woher weiß ich, dass ich es richtig geschrieben habe? –

+0

@MaorShitrit Sie nicht, es sei denn, Sie schrieben den UnitTest für jedes erwartete Verhalten * vor * den tatsächlichen Code (TDD) –

0

Junit ist nicht für jeden Test gedacht, die Ressourcen (Datei, dB nimmt oder Netzwerk)