TemporaryFolder не удаляется с помощью JUnit @Rule - PullRequest
0 голосов
/ 25 марта 2020

Я использую временную папку в своем модульном тесте с использованием @Rule of JUnit. Папка не удаляется после завершения испытаний sh

Java версия: 1.8

JUnit версия: 4.12

Os windows 10

Я создаю файл .csv в папке temp для его редактирования с помощью CSVPrinter из org. apache .commons

public class MyService {

public void createCSVFile(String basePath) {
        try (FileWriter out = new FileWriter(format("%s/file.csv", basePath));
             CSVPrinter printer = new CSVPrinter(out, CSVFormat.DEFAULT.withHeader(HEADERS))) {
            //printer.PrintRecord(args);
        } catch (IOException e) {
            log.error("Failed to create file.csv under " + basePath, e);
        }
    }
}

Тест:

    @Rule
    public TemporaryFolder folder = new TemporaryFolder();
    private String folderPath;
    private MyService myService;

    @Before
    public void setup() throws IOException {
        folder.newFile("file.csv");
        folderPath = folder.getRoot().getPath();
    }

    @Test
    public void testing_myService() {
        myService.createCSVFile(folderPath);
        //Assert 
    }

Когда я открываю папку, например: C: \ Users \ me \ AppData \ Local \ Temp \ junit2290989758736528709 Я все еще вижу файл .csv, поскольку он не был удален

Я пытался перенести создание файла, чтобы стать в тестах. Это не помогло

    @Test
    public void testing_myService() {
        folder.newFile("file.csv");
        myService.createCSVFile(folder.getRoot().getPath());
        //Assert 
    }

Я добавил метод @After для удаления папки

    @After
    public void cleanup() throws IOException {
        //Tried several ways to delete the folder and file as well
        //FileUtils.forceDelete(folder.getRoot().getAbsoluteFile());
        //folder.getRoot().delete();
        //FileUtils.deleteDirectory(folder.getRoot());
        //new File(folderPath +"/file.csv").delete();

        //All methods did not delete neither the direcotry (with exception can't delete file.csv) nor deleted the file.csv
    }

Я также пытался сам вызывать folder.create(); и folder.delete();, не используя @Rule Но папка также не была удалена

Файл.csv и папка помечаются как только для чтения при просмотре свойств на windows

I попытался изменить это в коде

folder.setWritable(true);
folder.setReadable(true);
folder.setExecutable(true);

Не удалось также удалить папку

Моя цель - найти решение, которое работает для любой среды, где код извлекается Например: конвейер CI на сервере linux и на windows

Есть ли другие причины такого поведения?

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Я подозреваю, что какой-то код содержит дескриптор файла, препятствующий удалению временного каталога.

Я предлагаю:

@Rule
public final TemporaryFolder folder = TemporaryFolder.builder()
    .assureDeletion()
    .build();

Это должно привести к тому, что TemporaryFolder вызовет исключение, если оно не удалось удалить папку.

0 голосов
/ 26 марта 2020

Возможно, вам следует создавать и удалять в папке в структуре вашего проекта.

Но это, вероятно, не работает из-за проблемы с разрешениями: либо измените права доступа к папке, чтобы программа имела привилегии для удаления или запустите программу / IDE от имени администратора.

Это должно решить проблему.

...