2016-04-12 4 views
0

Я заметил, что в конструкторе FileReader создан FileInputStream. Итак, что мне делать с этим в классе FileReader, но это не сработает. Может ли кто-нибудь понять это?Mock FileInputStream в FileReader не может работать с использованием PowerMock

код это, как показано ниже:

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'? – gontard

+0

Кто звонит «new InputStreamReader»? –

+0

@ gontard, Да. Простите за это. Я изменил код – Linhoo

ответ

0

Выстрел ответ - это невозможно, так как для фиктивных системных классов PowerMock должны иметь возможность модифицировать класс клиента, который использует системный класс. В вашем случае оба класса: кто использует и что используется, являются системными классами. Больше вы можете прочитать here (речь идет о статических вызовах системных классов, но то же самое верно для насмешливого вызова конструктора)

Также, пожалуйста, проверьте этот хороший момент: don't mock what you don't own. Для вас это означает:

  • Вы должны обернуть чтение данных из файла с помощью класса Util, который вы можете издеваться
  • Напишите интеграционный тест для вашего класса Util. Если ContentReader является классом утилиты, тогда вы не должны писать для него единичный тест.
Смежные вопросы