2016-04-12 10 views
0

Ich habe festgestellt, dass im FileReader-Konstruktor der FileInputStream erstellt wird. Also ich was in der FileReader-Klasse Mock es, aber es kann nicht funktionieren. Kann es jemand herausfinden?Mock FileInputStream in FileReader kann nicht mit PowerMock arbeiten

Der Code es wie folgt:

package util; 

import java.io.BufferedReader; 
import java.io.ByteArrayInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

import org.junit.Assert; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.Mockito; 
import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ FileReader.class, ContentReader.class}) 
public class FileReaderTest { 

    @Test 
    public void testGetContent() throws Exception { 
     File file = PowerMockito.mock(File.class); 
     InputStreamReader isr = new InputStreamReader(new ByteArrayInputStream("123".getBytes())); 
     PowerMockito.whenNew(InputStreamReader.class) 
       .withArguments(Mockito.any(FileInputStream.class)).thenReturn(isr); 
     Assert.assertEquals("123", ContentReader.getContent(file)); 
    } 

} 

class ContentReader { 

    public static String getContent(File file) throws IOException { 
     String content = "unknown"; 
     BufferedReader in = null; 
     in = new BufferedReader(new FileReader(file)); 
     content = in.readLine(); 
     in.close(); 
     return content; 
    } 

} 
+0

'ContentReader :: getContent' ist äquivalent zu' PidHelper :: getPidFromFile'? – gontard

+0

Wer ruft den 'neuen InputStreamReader' auf? –

+0

@ gontard, Ja. Das tut mir leid. Ich habe den Code geändert – Linhoo

Antwort

0

Schuss Antwort - es ist unmöglich, weil zu mock Systemklassen der PowerMock sollte eine Client-Klasse, um modifizierte Lage sein, die Systemklasse verwendet. In Ihrem Fall sind beide Klassen: Wer verwendet und was verwendet wird, sind Systemklassen. Mehr können Sie lesen here (es handelt sich um statische Aufrufe von Systemklassen, aber das gleiche gilt für meckern Konstruktor Anruf)

Überprüfen Sie auch diesen guten Punkt: don't mock what you don't own. Für Sie bedeutet dies:

  • Sie sollten das Lesen von Daten aus einer Datei über util Klasse wickeln, die Sie
  • einen Integrationstest schreiben für Ihre util Klasse verspotten. Wenn ContentReader eine util-Klasse ist, sollten Sie keinen Einheitentest dafür schreiben.