2016-04-12 17 views
0

'u kullanarak çalışamaz FileReader yapıcısında FileInputStream öğesinin oluşturulduğunu fark ettim. Bu yüzden FileReader sınıfında ne yapacağım, ama işe yaramıyor. Birisi anlayabilir mi?FileReader'da Mock FileInputStream, PowerMock

aşağıda gibi kod:

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',' PidHelper :: getPidFromFile' ile eşdeğerdir? – gontard

+0

"Yeni InputStreamReader" öğesini kimler arıyor? –

+0

@ gontard, Evet. Bunun için özür dilerim. Yeni bir FileReader (fiel) çağrıldığında, yeni InputStreamReader çağrıldığında, – Linhoo

cevap

0

Shot cevap - bu çünkü PowerMock sistem sınıfını kullanan bir istemci sınıfını değiştirilmiş gerekir sahte sistem sınıflarına, imkansız. Sizin durumunuzda her iki sınıf: kimin kullandığı ve ne kullanıldığı sistem sınıflarıdır. Daha fazla here'u okuyabilirsiniz (bu, sistem sınıflarının statik çağrıları ile ilgilidir, ancak yapıcı çağrısı alay etmek için de geçerlidir)

Ayrıca, şu iyi noktayı kontrol edin: don't mock what you don't own. Senin için anlamı: Sen

  • sizin util sınıf için bir entegrasyon testi yaz alay util sınıfından aracılığı dosyadan okuma verilerini yerleştirilmeli

    • . ContentReader bir kullanım sınıfı ise, bunun için birim testi yazmamalısınız.