Модульный тест существования директории - Junit - PullRequest
4 голосов
/ 01 июля 2019

У меня есть функция, которую я использую, чтобы определить, существует ли определенный путь к каталогу.Вот функция:

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 ]

1 голос
/ 01 июля 2019

Есть много способов сделать это, один из них может быть похож на приведенный ниже.
Предполагая, что метод 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();
    }
}
0 голосов
/ 02 июля 2019

Функция, которую вы показали, не подходит для модульного тестирования: с помощью модульного тестирования вы пытаетесь найти ошибки в небольших, изолированных частях программного обеспечения.Но какие ошибки могут быть в этом примере кода, которые не связаны с другими компонентами, то есть компонентом Files, компонентом Paths и фактической файловой системой?

Потенциальные ошибки в вашемНапример, о таких вопросах, как "я вызываю правильные функции?"или "я вызываю функции с правильными значениями для аргументов?"или «возвращать ли функции, которые я вызываю, аргументы так, как я ожидал», или «я использую путь, который также является путем, найденным в файловой системе».Это нельзя проверить с помощью юнит-тестирования, но с помощью интегратон-тестирования.

Представьте, что вы наметили неверный путь.Затем, в вашем модульном тесте вы также будете проверять тот же неправильный путь, и ваш модульный тест будет успешным.Только при запуске этого теста в качестве интеграционного теста в реальной файловой системе вы могли понять, что путь, который вы имели в виду, был неправильным и не соответствовал фактическому пути в файловой системе.

...