目录存在单元测试-Junit

时间:2019-07-01 17:27:14

标签: java junit integration-testing

我有一个函数,用于检测特定目录路径是否存在。功能如下:

public boolean isRunningOnSandbox() {
   return Files.isDirectory(Paths.get("/mySandbox/cloud/sandbox"));
}

如您所见,它依赖于静态方法isDirectory。在我的团队中,我们不使用PowerMock进行测试。

那么,如何测试此方法?我曾尝试编写如下测试:

@Rule
public TemporaryFolder temporaryFolder;

@Test
public void test() throws IOException {
    File parent = new File("/");
    temporaryFolder = new TemporaryFolder(parent);
    temporaryFolder.create();
    File folder = temporaryFolder.newFolder("mySandbox", "cloud", "sandbox");
    subject.isRunningOnSandbox();
}

但是,我得到一个错误

ava.io.IOException: Permission denied

因为它不允许我在根目录下创建一个临时文件夹。我想有一种更好的方法来测试此代码,而不是尝试创建一个文件夹。

2 个答案:

答案 0 :(得分:1)

有很多方法可以做到,其中之一可能像下面的方法。
假设isRunningOnSandbox方法在某个类SomeClass中,然后以这种方式重构该类:

public class SomeClass {

    public boolean isRunningOnSandbox() {
        return Files.isDirectory(Paths.get(getSanboxPath()));
    }

    protected String getSanboxPath(){
        return "/mySandbox/cloud/sandbox";
    }
}

,然后在测试中将您有权访问的另一个目录注入到该类中,例如:

public class SomeClassTest {

    class SomeClassToTest extends SomeClass{
        String folder;
        public SomeClassToTest(String folder){
            this.folder = folder;
        }
        @Override
        protected String getSanboxPath(){
            return folder;
        }
    }

    static String sandboxFolder = "myTestSandobxFolder";

    static Path tempDir;

    @BeforeClass
    public static void createFolder() throws IOException {
        tempDir = Files.createTempDirectory(sandboxFolder);
    }

    @AfterClass
    public static void deleteFolder() throws IOException {
        Files.delete(tempDir);
    }

    @Test
    public void IsRunningOnSandbox_shouldReturnTrueWhenPathExists() throws IOException {
        //given
        SomeClass testedObject = new SomeClassToTest(tempDir.toString());
       //when
        boolean result = testedObject.isRunningOnSandbox();
        //then
        assertThat(result).isTrue();
    }

    @Test
    public void IsRunningOnSandbox_shouldReturnFalseWhenPathDoesNotExist() throws IOException {
        //given
        SomeClass testedObject = new SomeClassToTest("/abcdef123");
        //when
        boolean result = testedObject.isRunningOnSandbox();
        //then
        assertThat(result).isFalse();
    }
}

答案 1 :(得分:0)

您显示的功能不适合单元测试:通过单元测试,您尝试在孤立的小型软件中查找错误。但是,在此示例代码中,哪些错误可能与其他组件(即Files组件,Paths组件和实际文件系统)无关?

您的示例中潜在的错误与“我在调用正确的函数吗?”之类的问题有关。或“我用适当的参数值调用函数吗?”或“执行我调用的函数按预期返回参数”或“我使用的路径也是文件系统中找到的路径”。这不能通过单元测试来检查,而可以通过积分测试来检查。

想像一下您的想法不对。然后,在单元测试中,您还将检查相同的错误路径,并且单元测试将成功。仅当在真实文件系统上运行该测试作为集成测试时,您才能弄清楚您所记住的路径是错误的,并且与文件系统中的实际路径不匹配。