2014-06-19 121 views
2

我想了解如何可以模擬靜態方法,特別是從靜態Files.class。使用Mockito來模擬java.nio.file.Files靜態方法

基本上,只要該行執行:

Files.newInputStream(this.getPathObj(), StandardOpenOption.READ); 

我希望它只是返回一個對象,它是一個InputStream的實例。

這是我的類與我試圖嘲笑的靜態方法。

public class JavaFileInput{ 

private Path path; 

public JavaFileInput(Path path){ 
    this.path = path; 
} 

public InputStream getInputStream() throws IOException { 
    return Files.newInputStream(this.getPathObj(), StandardOpenOption.READ); 
} 

public Path getPathObj() { 
    return this.path; 
} 

} 

這是一些「僞十歲上下的」單元測試代碼,顯然是行不通的,但我希望它描繪的是什麼,我試圖完成的想法。

@Mock(name="path") 
private Path mockedPath = Mockito.mock(Path.class); 

@InjectMocks 
private JavaFileInput javaFile_MockedPath; 

@Before 
public void testSetup(){ 
    javaFile_MockedPath = new JavaFileInput(mockedPath); 
    MockitoAnnotations.initMocks(this); 
} 

@Test 
public void getNewInputStreamTest(){ 
    //Setup 
    Mockito.when(Files.newInputStream(mockedPathObj, StandardOpenOption.Read)).thenReturn(new InputStream()); 

    //Test 
    InputStream outputValue = javaFile_MockedPath.getInputStream(); 

    //Validate 
    assertTrue(outputValue instanceof InputStream); 

} 

這是否有意義?有沒有人需要做類似的事情?任何幫助將不勝感激。

謝謝你的時間!

+0

你可能想看看PowerMock。 – chrylis

回答

1

我不清楚你的JavaFileInput提供了什麼價值。但是,要測試靜態方法,您可以查看PowerMock

+0

Romski - 感謝您的迴應。我會考慮給PowerMock一個嘗試。我在網上看到很多其他的東西也推薦了這個工具。 – Chiefwarpaint

-1

對於標準的Mockito,你不能嘲笑靜態方法 - 我會質疑你這樣做的原因。

你想通過嘲諷newInputStream方法來測試什麼?你只是創造了一個重​​言式 - 你的方法返回你告訴它返回的東西。而且instanceof InputStream也是重言式。

嘲笑JavaFileInput來測試依賴於它的另一個類(可能通過使用具有示例數據的ByteArrayInputStream)會更有意義。

+0

Tom G - 感謝您的及時回覆!我想我只是想測試,以確保getInputStream()返回一個InputStream實例,就這些。我應該測試其他的東西嗎?實際上有很多來自Files.class的靜態方法,我想模​​擬它們,比如Files.exists()和Files.isDirectory()等等。我只是希望在嘗試其他方法之前弄清楚如何處理這個測試。 – Chiefwarpaint

相關問題