Java Junit测试模拟文件操作

Java Junit测试模拟文件操作,java,spring,file-io,junit4,easymock,Java,Spring,File Io,Junit4,Easymock,我有一段类似于下面的代码,我被要求进行Junit测试。我们正在使用Junit、EasyMock和Spring框架。我没有做太多的Junit测试,对于如何模拟下面的内容,我有点不知所措 基本上,当我在我的机器上编写或运行测试时,文件所在目录中的文件路径将不存在。我想知道是否有一种方法可以将对象模拟到一个临时位置,因为它实际运行的位置保证存在并在集成测试期间进行测试 然而,我想知道这样做是否明智,或者当目录实际存在时,当它与项目的其余部分集成时是否应该对其进行测试 感谢您的帮助,因为Junit测试对

我有一段类似于下面的代码,我被要求进行Junit测试。我们正在使用Junit、EasyMock和Spring框架。我没有做太多的Junit测试,对于如何模拟下面的内容,我有点不知所措

基本上,当我在我的机器上编写或运行测试时,文件所在目录中的文件路径将不存在。我想知道是否有一种方法可以将对象模拟到一个临时位置,因为它实际运行的位置保证存在并在集成测试期间进行测试

然而,我想知道这样做是否明智,或者当目录实际存在时,当它与项目的其余部分集成时是否应该对其进行测试

感谢您的帮助,因为Junit测试对我来说是全新的。我环顾四周,但看不到如何做我想做的事(可能是一个很好的暗示,我不应该这样做:P)


第一个选项是将文件注入到类中,您可以直接注入模拟。通常是更好的选择,但并不总是优雅或可行的

通过为像这样有问题的对象创建一个受保护的包装器函数,我从这些东西中获得了一些好处。在您的受测班级中:

protected File OpenFile(String fileName) { return new File(filename;}
在测试类中:

File file = EasyMock.createNiceMock(File.class);

private MyClass createMyClass() {
  return new MyClass() {
    @Override protected File OpenFile(String fileName) { return file; }
  };
}

@Test public testFoo() {
  EasyMock.expect(file.exists()).andStubReturn(true);
  //...
  MyClass myClass=createMyClass();
  // ...
}

如果需要,您可以在此情况下保存构造参数(文件名)以进行验证。

MyClass类将不知道您在生产中创建的
文件。
File file = EasyMock.createNiceMock(File.class);

private MyClass createMyClass() {
  return new MyClass() {
    @Override protected File OpenFile(String fileName) { return file; }
  };
}

@Test public testFoo() {
  EasyMock.expect(file.exists()).andStubReturn(true);
  //...
  MyClass myClass=createMyClass();
  // ...
}