2012-10-17 101 views
0

我想嘲笑文件和對象的FileInputStream爲JUnit測試。測試類使用文件和文件的FileInputStream用的Mockito/PowerMockito

讓我們說我們有一個分析器。解析器外部只能通過解析(File myFile)方法訪問。其他方法,如readMyStream ....是私有的。

例如代碼:

public class Parser { 

    public HashMap<String, String> parse(File myFile) throws Exception { 
     HashMap<String, String> myConfig; 
     Config config; 

     try { 
      //this line gives me a headache 
      FileInputStream myFileInputStream = new FileInputStream(myFile); 

      configStream = readMyStream(myFileInputStream); 
       .......... 
     } catch (FileNotFoundException e) { 
       throw e; 
     } 
     return myConfig; 
    } 
    //reads the stream 
    private Config readMyStream(FileInputStream myFileInputStream) { 
     Config config;  

     ...JDOM stuff....  

     return config; 
    } 
} 

的問題我面對:

  • 如何斷言文件對象的的FileInputStream(PowerMockito)這樣的文件屬於此的FileInputStream與下列內容
  • 如何嘲笑一個私有方法(的Mockito/PowerMockito)

嘲諷/不工作的一個例子:)......

public class ParserTest { 

    @Test 
    public final void testParse() { 
     File MOCKEDFILE = PowerMockito.mock(File.class); 
     PowerMockito.when(MOCKEDFILE.exists()).thenReturn(true); 
     PowerMockito.when(MOCKEDFILE.isFile()).thenReturn(true); 
     PowerMockito.when(MOCKEDFILE.isDirectory()).thenReturn(false); 
     PowerMockito.when(MOCKEDFILE.createNewFile()).thenReturn(true); 
     PowerMockito.when(MOCKEDFILE.length()).thenReturn(11111111L); 

     //what about the path of MOCKEDFILE which isn't existing 
     PowerMockito.when(MOCKEDFILE.getPath()).thenReturn(?????); 

     //how to assign a File an FileInputStream? (I thought something like) 
     PowerMockito.mockStatic(FileInputStream.class); 
     FileInputStream MOCKEDINPUTSTREAM = PowerMockito.mock(FileInputStream.class); 
     PowerMockito.whenNew(FileInputStream.class).withArguments(File.class).thenReturn(MOCKEDINPUTSTREAM); 

     //how to mock the private method readMyStream 
    } 

回答

4

而不是嘲諷File,我會建議使用TemporaryFolder規則,並建立/無法創建文件爲適當。

在我以前的項目中,我們編寫了一個FileInputStreamSupplier類,用於創建FileInputStream。然後可以模擬這個類來提供模擬的FileInputStream以允許測試行爲。一般來說,你可以讓你的班級採用Supplier<FileInputStream>(使用番石榴)並嘲笑它。

+0

請你發佈一個示例代碼...我不明白的JUnit TemporaryFolder規則應如何與我的問題。 –

+0

您可以使用'TemporaryFolder'在運行時創建一個符合測試需求的文件,無論文件是否存在(創建它),具有特定的名稱,擴展名,大小等等。使用這個與'Supplier '結合使用來測試不可測試? –

+0

我可以寫類似 '@rule 公共TemporaryFolder tmpFolder =新TemporaryFolder(); @Test 公共無效testParse_xyas(){ 文件TMPFILE = tmpFolder.newFile(文件名); //現在如何聲明我的tmpFile InputStream? } ..' –

相關問題