2013-09-24 7 views
5

habe ich Code unten in einem Verfahren, das ichMock Datei, Filereader und BufferedReader-Klasse Mockito

File f = map.get("key1") 
BuffereReader r = new BufferedReader(new FileReader(f)); 
String line=null; 
do { 
    line=r.readLine(); 
} while(r!=null); 

ich verspotten will diese Operation testen will, so dass ich den Inhalt der Datei aus dem JUnit passieren kann Testfall. Ich habe unten getan:

Map fles = Mockito.mock(ConcurrentHashMap.class); 
File file = Mockito.mock(File.class); 
Mockito.when(files.get("key1")).thenReturn(file); 

FileReader fileReader = Mockito.mock(FileReader.class); 
BufferedReader bufferedReader = Mockito.mock(BufferedReader.class); 

try { 
    PowerMockito.whenNew(FileReader.class).withArguments(file).thenReturn(fileReader); 
    PowerMockito.whenNew(BufferedReader.class).withArguments(fileReader).thenReturn(bufferedReader); 
    PowerMockito.when(bufferedReader.readLine()).thenReturn("line1") 
     .thenReturn("line2").thenReturn("line3"); 

    } catch (Exception e) { 
     Assert.fail(); 
    } 

Also im Grunde ich brauche „line1“, „line2“ und „line3“, wie Zeilen aus der Datei zu übergeben, die von dem verspottete BufferedReader gelesen werden.

Allerdings fehlschlägt es als NullPointerException beim Versuch, neue FileReader (f) Teil instanziieren.

Also ist es, weil ich einen BufferedReader nicht verspotten kann oder der Ansatz falsch ist?

Dank

Antwort

0

Sie können PowerMock Anmerkungen versuchen. Überprüfen Sie dies: https://code.google.com/p/powermock/wiki/MockConstructor

+0

ich PowerMockito verwende und PowerMock ist mir nicht zur Verfügung. Daher werden alle Antworten im Zusammenhang mit PowerMockito sehr nützlich sein. – user2654241

+0

Überprüfen Sie diesen Link: http://stackoverflow.com/questions/7523389/how-doi-i-use-powerermockito-to-mock-the-construction-of-new-objects-when-testing-a – Sai

9

Sie könnten eine Methode für das tatsächliche Lesen extrahieren und dann das stattdessen testen. Das würde bedeuten, dass Sie nur einen einzelnen Leser verspotten müssen. Zum Beispiel würde der Code so etwas wie dieses:

public void aMethod(){ 
    File f = map.get("key1") 
    BuffereReader r = new BufferedReader(new FileReader(f)); 
    readStuff(r); 
} 

public void readStuff(BufferedReader r){ 
    String line=null; 
    do { 
     line=r.readLine(); 
    } while(r!=null); 
} 

dann Testcode wäre wie folgt aus:

BufferedReader bufferedReader = Mockito.mock(BufferedReader.class); 
Mockito.when(bufferedReader.readLine()).thenReturn("line1", "line2", "line3"); 
objUnderTest.readStuff(bufferedReader); 
//verify result 
+6

+1 zu Neuschreiben des Tests, aber an diesem Punkt müssen Sie nicht einmal den BufferedReader vortäuschen; Sie können direkt zu 'new BufferedReader (new StringReader (" line1 \ nline2 \ nline3 "))' 'springen. –