2013-09-24 15 views
5

Ho seguito il codice in un metodo che voglio provareMock file, FileReader e la classe BufferedReader utilizzando Mockito

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

voglio deridere questa operazione in modo che possa passare il contenuto del file dal JUnit test case. Ho fatto qui di seguito:

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(); 
    } 

Quindi, in pratica ho bisogno di passare "linea 1", "linea 2" e "line3" come righe dal file che vengono lette dal BufferedReader deriso.

Tuttavia, in tal caso, fallisce come NullPointerException quando si tenta di creare un'istanza di una nuova parte FileReader (f).

Quindi è perché non riesco a prendere in giro un BufferedReader o l'approccio è sbagliato?

Grazie

risposta

0

È possibile provare le annotazioni di PowerMock. Verificare: https://code.google.com/p/powermock/wiki/MockConstructor

+0

Sto usando PowerMockito e PowerMock non è disponibile per me. Quindi qualsiasi risposta nel contesto di PowerMockito sarà molto utile. – user2654241

+0

Controlla questo link: http://stackoverflow.com/questions/7523389/how-do-i-use-powermockito-to-mock-the-construction-of-new-objects-when-testing-a – Sai

9

È possibile estrarre un metodo per eseguire la lettura effettiva e quindi testarlo. Ciò significherebbe che devi solo prendere in giro un singolo lettore. Ad esempio, il codice sarebbe qualcosa di simile:

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); 
} 

quindi il codice di prova sarebbe più simile al seguente:

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

+1 a riscrivendo il test, ma a quel punto non hai nemmeno bisogno di prendere in giro BufferedReader; puoi saltare direttamente a 'new BufferedReader (new StringReader (" line1 \ nline2 \ nline3 "))'. –

Problemi correlati