2012-10-17 80 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? } ..' –

相关问题