-2

我需要创建一个List<File> files, 以便它包含 3 个虚拟文件。我怎么做?

我需要它进行单元测试。

我做了

private File file1 = mock(File.class);
private File file2 = mock(File.class);
private File file3 = mock(File.class);

List<File> files = Lists.newArrayList(file1, file2, file3);

但我认为这是所有可能的一条线。

4

3 回答 3

6

我建议不要嘲笑File,而是制作假值。作用于File实例的方法往往关心文件路径和/或文件是否存在,因此最直接的方法是使用真实实例。

下面是一个使用 JUnit4 的示例,它创建了一个包含三个File实例的列表来引用目录中不存在的文件:

@RunWith(JUnit4.class)
public class ExampleTest {
  @Rule
  public TemporaryFolder testFolder = new TemporaryFolder();

  private final Foo foo = new Foo();

  @Test
  public void shouldFailIfFilesDoNotExist() {
    List<File> files = Lists.newArrayList(
        testFolder.newFile(),
        testFolder.newFile(),
        testFolder.newFile());
    foo.doIt(files);
  }
}

如果您关心文件名,可以将文件名传递给TemporaryFolder.newFile(String)

于 2015-01-02T17:44:57.547 回答
0

是的,您可以在一行中完成:

List<File> files = Lists.newArrayList( mock(File.class), mock(File.class), mock(File.class) ); 

但我不确定这是一个好的解决方案。java.io.File 是不可变的,所以它毫无用处。如果您没有实际文件的路径,我建议您使用 null (即使文件本身不存在)

于 2014-12-31T10:26:41.733 回答
0

如果您只想创建任意文件,那么您可以执行以下操作:

final List<File> files = Stream.generate(() -> mock(File.class)).limit(3).collect(toList());

但显然你不能在这些模拟等上存根任何方法。所以根据你想要做什么,你原来的方法可能更有用。

于 2014-12-31T11:10:18.317 回答