Java 有没有办法用Mockito模拟File.exist()/File.isFile()方法? ArrayList m_files=new ArrayList(); 对于(int i=0;i

Java 有没有办法用Mockito模拟File.exist()/File.isFile()方法? ArrayList m_files=new ArrayList(); 对于(int i=0;i,java,file,unit-testing,junit,mockito,Java,File,Unit Testing,Junit,Mockito,我的代码是关于删除一些本地文件。我想对删除文件失败的情况进行单元测试。有没有办法模拟file.exist()/file.isFile()或以任何方式模拟该静态方法FileUtiles.deleteQuitely()或其他解决方案?您可以按如下方式模拟文件类行为 ArrayList<File> m_files = new ArrayList<File>(); for(int i = 0; i < m_files.size(); i++) { File m_f

我的代码是关于删除一些本地文件。我想对删除文件失败的情况进行单元测试。有没有办法模拟file.exist()/file.isFile()或以任何方式模拟该静态方法FileUtiles.deleteQuitely()或其他解决方案?

您可以按如下方式模拟文件类行为

ArrayList<File> m_files = new ArrayList<File>();
for(int i = 0; i < m_files.size(); i++) {
     File m_file = m_files.get(i);
     if(m_file.exists()) {
        FileUtils.deleteQuietly(m_file);
        if(m_file.isFile()) {
          m_log.error("Deleting file " + m_file.getName() +" fails");
          throw new ServiceUnavailableException("Not successfully delete the file " + m_file.getName());
        } else {
          m_log.info("Successfully delete the file " + m_file.getName());
        }
     }
  }
这应该会有所帮助

编辑

您需要使该方法可测试。方法应接收其正在操作的文件。模拟对象应作为参数传递。比如说,

 File mockedFile = Mockito.mock(File.class);
 Mockito.when(mockedFile.exists()).thenReturn(true);
public void deleteMyFile(列出m_文件){
对于(int i=0;i
测试代码如下所示

public void deleteMyFile(List<File> m_files){

  for(int i = 0; i < m_files.size(); i++) {
  File m_file = m_files.get(i);
  if(m_file.exists()) {
     FileUtils.deleteQuietly(m_file);
     if(m_file.isFile()) {
       m_log.error("Deleting file " + m_file.getName() +" fails");
       throw new ServiceUnavailableException("Not successfully delete the file " + m_file.getName());
     } else {
       m_log.info("Successfully delete the file " + m_file.getName());
     }
   }
  }
 }
@测试
公开无效测试(){
File mockedFile=Mockito.mock(File.class);
Mockito.when(mockedFile.exists())。然后返回(true);
Mockito.when(mockedFile.isFile())。然后返回(true);
列表文件=新的ArrayList();
添加(mockedFile);
MyTestClass MyTestClass=新的MyTestClass();
myTestClass.deleteMyFile(文件);
}

U可以使用power mock模拟静态方法

@Test
public void test(){
    File mockedFile = Mockito.mock(File.class);
    Mockito.when(mockedFile.exists()).thenReturn(true);
    Mockito.when(mockedFile.isFile()).thenReturn(true);
    List<File> files = new ArrayList<>();
    files.add(mockedFile);
    MyTestClass myTestClass = new MyTestClass();
    myTestClass.deleteMyFile(files);
}
通过在测试类的顶部使用下面的注释,确保您为静态模拟准备了类

    mockStatic(File.class);
    when(File.exists()).thenReturn(true);
并使用
@RunWith(PowerMockRunner.class)

看,我试了很多次,但仍然不起作用。我可以模拟这个类中的其他对象,但不能用于文件。
    @PrepareForTest(YourClassNameWhereYouWantToInjectStaticMock.class)