2013-09-24 15 views
5

Mam poniżej kodu w sposób, który chcę przetestowaćMock File, FileReader i klasa BufferedReader przy użyciu Mockito

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

chcę wyśmiewać tę operację tak, że mogę przekazać zawartość pliku z JUnit przypadek testowy. Zrobiłem poniżej:

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

Więc w zasadzie muszę przekazać „line1”, „” i „line2 Line3” jak linie z pliku, które są odczytywane przez wyśmiewali BufferedReader.

Jednak po wykonaniu tej czynności kończy się niepowodzeniem jako wyjątek NullPointerException podczas próby utworzenia instancji nowej części FileReader (f).

Czy to dlatego, że nie mogę kpić z BufferedReader lub podejście jest błędne?

Dzięki

Odpowiedz

0

Możesz wypróbować adnotacje PowerMock. Sprawdź to: https://code.google.com/p/powermock/wiki/MockConstructor

+0

Używam PowerMockito i PowerMock nie jest dla mnie dostępne. Więc wszelkie odpowiedzi w kontekście PowerMockito będą bardzo przydatne. – user2654241

+0

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

9

Można wyodrębnić metodę wykonywania rzeczywistego odczytu, a następnie przetestować. To by znaczyło, że musisz tylko kpić z jednego czytelnika. Na przykład, kod byłoby coś takiego:

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

następnie kod testu byłoby bardziej jak następuje:

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

+1 do przepisanie testu, ale w tym momencie nie trzeba nawet kpić z BufferedReader; możesz przejść bezpośrednio do 'new BufferedReader (new StringReader (" line1 \ nline2 \ nline3 "))'. –

Powiązane problemy