如何在Junit中测试File.delete()函数

时间:2017-11-19 15:42:00

标签: java file junit

我有一种方法如下:

public final class someTask {
     public void sampleMethod(String filePath) {
         //It is calling Files.delete() method.
         Files.delete(new File(filePath).toPath)
     }
 }

当我测试上面的方法(例如该文件中的ValidRecord,有效文件参数或不是等)测试用例时,大多数情况下我的测试用例都失败了。请有人帮我测试以上情况。

要获取我在下面的代码段

使用的文件
@Mock
File fileMock;

@Rule
ExpectedException exception = ExpectedException.none();

PowerMockito.whenNew(File.class).withArguments(VALID_Path).thenReturn(fileMock);
PowerMockito.when(fileMock.exists()).thenReturn(true);
PowerMockito.when(fileMock.isFile()).thenReturn(true);

在此,我不打算测试Files.deplete()方法,但我正在计划我自己的方法的测试行为。在那个过程中每次我得到" java.nio.file.NoSuchFileException"异常甚至我创建临时文件。

请一些可以提供示例,如何测试这个。

3 个答案:

答案 0 :(得分:4)

有人可能会争辩说,通过模拟和互动验证行为是错误的。我会做以下

  • 在本地文件系统上创建临时文件

  • 调用方法std::vector<int>

  • 确认该文件不再存在。

答案 1 :(得分:0)

解决此类问题的一个有价值的方法是退后一步批评您的应用程序设计。问问自己,你是否有设计问题,特别是当你觉得测试你的代码似乎有点困难时。

确实:您可以/应该改进软件的设计!

让我们从你的班级开始(顺便说一句,我把名字改为骆驼套管):

public final class SomeTask {
    public void sampleMethod(String filePath) {
        Files.delete(new File(filePath).toPath);
    }
}

我将忽略异常。此外,在您的代码中的某个地方,您正在使用此类:

SomeTask task = new SomeTask();
String filePath = ...
task.sampleMethod(filePath);

要实现的第一件事:在您的类SomeTask中,您依赖于删除文件功能。 使此依赖关系可见!

但是你怎么做的?使用界面:

@FunctionalInterface
public interface FileDeletor {
    void delete(String filePath);
}

您现在可以通过为此类deletor添加字段来更改您的课程:

public final class SomeTask {
    private final FileDeletor deletor;

    public SomeTask(FileDeletor deletor) {
        this.deletor = Objects.requireNonNull(deletor);
    }

    public void sampleMethod(String filePath) {
        deletor.delete(filePath);
    }
}

使用这种方法,您可以将文件删除的技术操作委托给另一个现在必须实现该接口的类(如下所示)。这也使你的课程更加连贯,因为它现在可以专注于自己的特色。

我们现在需要一个实现该接口的类:

public final class DefaultFileDeletor implements FileDeletor {
    @Override
    public void delete(String filePath) {
        Files.delete(new File(filePath).toPath());
    }
}

请注意,我仍然在这里忽略例外。现在我们还必须改变使用方面:

FileDeletor deletor = new DefaultFileDeletor();
SomeTask task = new SomeTask(deletor);
String filePath = ...
task.sampleMethod(filePath);

使用这种方法,您还可以通过Spring自动装配或类似的依赖注入框架构建应用程序。

让我们继续前进到测试区域。如果您愿意,还可以测试新课程DefaultFileDeletor。但是你知道它只使用了一个JDK功能,它本身就足够了。无需测试这个简单的类。

但是你怎么能测试你的班级SampleTask?首先,您需要为了测试目的而实现接口:

public class FileDeletorForTestPurposes implements FileDeletor {
    private String filePath;
    private boolean deleted;

    @Override
    public void delete(String filePath) {
        this.filePath = filePath;
        deleted = true;
    }

    public String getFilePath() {
        return filePath;
    }

    public boolean isDeleted() {
        return deleted;
    }
}

现在您可以测试您的代码:

FileDeletorForTestPurposes deletor = new FileDeletorForTestPurposes();
SomeTask task = new SomeTask(deletor);
String filePath = ...
task.someMethod(filePath);
assertEquals(filePath, deletor.getFilePath());
assertEquals(true, deletor.isDeleted());

您现在也可以简单地创建一个FileDeletor模拟,并通过表达对它的期望来使用它。

答案 2 :(得分:0)

下面以 Files.delete 功能测试删除文件为例 假设您有一个如下所示的功能

public boolean deleteFilesWithinPath(Path path, int retryCount){
    boolean status=false;
    while (retryCount < 3) {
        try {
            Files.delete(path);
            LOG.info("File  deleted successfully from work Dir");
            status=true;
            break;
        } catch (IOException e) {
            try {
                LOG.error(e.getMessage());
                LOG.info("File  was not deleted . Retrying ..");
                status=false;
                Thread.sleep(2000);
                retryCount++;
            } catch (InterruptedException e1) {
                status=false;
                LOG.error(e1.getMessage());
                Thread.currentThread().interrupt();
            }
        }

    }
    return status;
}

然后您可以使用 Powermockit 或 Mockito 测试上述功能,如下所示

@Test
public void testdeleteFilesWithinPath() throws Exception{
    File mockFileTemp = temporaryFolder.newFile("test.csv");
    PowerMockito.mockStatic(Paths.class);
    PowerMockito.mockStatic(Files.class);
    int retrycount=0;
    Path path = mockFileTemp.getAbsoluteFile().toPath();
    boolean status = mftFileDownloadServiceImp.deleteFilesWithinPath(path,retrycount);
    assertTrue(status);
}

@Test
public void testdeleteFilesWithinPathForIOException() throws Exception{
    File mockFile = temporaryFolder.newFile("test.csv");
    PowerMockito.mockStatic(Paths.class);
    PowerMockito.mockStatic(Files.class);
    Path path = mockFile.getAbsoluteFile().toPath();
    Files.delete(path);
    int retrycount=0;
    try{
        mftFileDownloadServiceImp.deleteFilesWithinPath(path,retrycount);
    } catch (Exception e) {
        assertThat(e).isInstanceOf(IOException.class);
    }
}