使用Mockito模拟File.exist()/ File.isFile()方法的任何方法吗?

时间:2018-10-31 02:26:28

标签: java file unit-testing junit mockito

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.exist()/ file.isFile(),还是可以模拟静态方法FileUtiles.deleteQuitely()或其他解决方案?

2 个答案:

答案 0 :(得分:0)

您可以如下模拟文件类行为。

 File mockedFile = Mockito.mock(File.class);
 Mockito.when(mockedFile.exists()).thenReturn(true);

tutorial应该有用。

编辑...

您需要使该方法可测试。方法应将其正在处理的文件纳入其中。模拟对象应作为参数传递。例如,

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());
     }
   }
  }
 }

测试代码如下所示。

@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);
}

答案 1 :(得分:0)

U可以使用超级模拟功能模拟静态方法

    mockStatic(File.class);
    when(File.exists()).thenReturn(true);

通过在测试类的顶部使用以下注释,确保为静态模拟准备了类

    @PrepareForTest(YourClassNameWhereYouWantToInjectStaticMock.class)

然后使用 @RunWith(PowerMockRunner.class)