【问题标题】:Test Class using File and FileInputStream with Mockito/PowerMockito [duplicate]使用带有 Mockito/PowerMockito 的 File 和 FileInputStream 测试类 [重复]
【发布时间】:2012-10-17 15:26:05
【问题描述】:

我想为 JUnit 测试模拟一个 File 和 FileInputStream 对象。

假设我们有一个解析器。从外部解析器只能通过 parse(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
   }

【问题讨论】:

    标签: java junit mockito powermock


    【解决方案1】:

    与其模拟File,我建议使用TemporaryFolder 规则并酌情创建/不创建文件。

    在我之前的项目中,我们编写了一个FileInputStreamSupplier 类,用于创建FileInputStream。然后可以模拟此类以提供模拟的FileInputStream 以允许测试行为。一般来说,你可以让你的班级接受Supplier&lt;FileInputStream&gt;(使用番石榴)并模拟它。

    【讨论】:

    • 能否请您发布示例代码...我不明白 JUnit TemporaryFolder 规则应该如何与我的问题相关。
    • 您可以在运行时使用TemporaryFolder 创建一个匹配测试需求的File,无论文件是否存在(创建它),具有特定的名称、扩展名、大小、等等。您尝试将其与 Supplier&lt;FileInputStream&gt; 结合使用无法测试的场景是什么?
    • 我可以写类似@Rule public TemporaryFolder tmpFolder = new TemporaryFolder(); @Test public void testParse_xyas() { File tmpFile = tmpFolder.newFile(FILENAME); //now how to assert my tmpFile an InputStream?? }..
    • assert my tmpFile an InputStream 是什么意思?该文件不是 InputStream。 InputStream 将围绕new FileInputStream(file) 行中的文件创建。如果您需要模拟 FileInputStream,请再次使用我上面提到的供应商。
    • 发现这个链接非常有用:JUnit Rule Entity Manager
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多