Подтвердить что ты не робот

Каков правильный способ записи во временный файл во время модульных тестов с Maven?

Я написал файл unit test, который записывает файл в файловую систему, не задавая пути, который он записывает в рабочий каталог; поэтому, если он выполняется из каталога проекта, он записывает его в корневой каталог проекта, если в родительском каталоге проектов он записывает корневой каталог родителей.

Итак, каков правильный способ записи в целевой каталог? Возможно, каталог внутри целевого каталога?

Если я просто укажу target/ с файлом, он будет записывать в целевой объект родительских проектов вместо целевых объектов.

ОБНОВЛЕНИЕ. Я действительно хочу файл после завершения тестирования. Файл предназначен для формата извлечения сторонних сторон, который необходимо отправить третьим сторонам. Тест можно включить/выключить, чтобы я мог запускаться только в том случае, если формат файла изменяется для повторного утверждения. Это не огромная проблема, когда файл идет, но мне бы хотелось найти что-то, что легко найти.

4b9b3361

Ответ 1

Вы можете попытаться использовать TemporaryFolder JUnit @Rule, как описано здесь

TemporaryFolder создает папку в каталоге временных файлов по умолчанию, указанном системным свойством java.io.tmpdir. Метод newFile создает новый файл во временном каталоге, а newFolder создает новую папку.

Когда метод тестирования завершается, JUnit автоматически удаляет все файлы и каталоги в и в том числе TemporaryFolder. JUnit гарантирует удаление ресурсов, проходит или не проходит тест.


После обновления вопроса

Вы можете изменить рабочий каталог, используемый maven-surefire-plugin.

<plugins>
    [...]
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.12.3</version>
        <configuration>
          <workingDirectory>${project.build.directory}</workingDirectory>
        </configuration>
      </plugin>
    [...]
</plugins>

Вы можете изменить этот рабочий каталог на все, что вам нужно для ваших тестов, например ${project.build.directory}/my_special_dir/.

Рабочий каталог в плагине surefire влияет только на тесты, которые выполняются, и ТОЛЬКО для тестов, проводимых maven. Если вы запускаете свои тесты из IDE, рабочий каталог будет чем-то другим.

Ответ 2

Не нужно изобретать велосипед...

JDK предоставляет способ создания временного файла и способ автоматического его удаления при выходе:

File file = File.createTempFile( "some-prefix", "some-ext");
file.deleteOnExit();

Используйте файл, и он будет удален автоматически, когда ваш тест закончится. Это все, что нужно.

Чтобы указать каталог для временных файлов, используйте перегруженный метод:

File file = File.createTempFile( "prefix", "ext", new File("/some/dir/path"));

Ответ 3

Я бы написал процедуру, которая определяет, где должен записываться файл, который я потом буду добавлять, в общем, я стараюсь избегать (по возможности) доступа к постоянным данным в unittests, например, при доступе к файлам IO или в базе данных, это имеет соображения производительности и другие.

Взгляните на этот вопрос: fooobar.com/questions/109249/...

Ответ 4

Вы хотите иметь возможность запускать тесты как из среды IDE, так и из Maven, поэтому лучше всего написать свои тесты, чтобы они не предполагали, что они запускаются в Maven.

Один из лучших способов работы с временными файлами - использовать правила junit. Это позволяет вам полагаться на правило для очистки для вас.

Ответ 5

Временные файлы должны быть созданы во временном каталоге. Извлеките его, используя вызов System.getProperty("java.io.tmpdir")

Временный файл должен быть временным, т.е. должен быть удален, когда он не нужен. Чтобы добиться этого, не забудьте удалить его в блоке finally или в коде, который запускается после теста, т.е.:

File tmpFile = ...
try {
   // deal with tempFile
} finally {
    tempFile.delete();
}

и/или

public class MyTestCase {
    private File tmpFile = null;

    @Before
    public void setUp() {
        tmpFile = ...;
    }

    @Test
    public void setUp() {
        // deal with tmpFile
    }

    @After
    public void setUp() {
        tmpFile.delete();
    }
}

Используйте File.createTempFile(String prefix, String suffix), если это возможно, то есть вы можете использовать файл со специальным именем, сгенерированным createTempFile().

Используйте file.deleteOnExit(). Это создает привязку, которая автоматически удаляет файл при завершении работы JVM. Файл останется только в том случае, если JVM был убит с помощью kill -9, поэтому у него не было возможности запустить код завершения.

Ответ 6

Чтобы заявить об этом заранее, я категорически против того, чтобы делать такие вещи в unit test. Я действительно не пробовал это, но он должен работать:

Предположим, что вы используете плагин surefire, из документа, который он цитировал, вы можете получить доступ к базовому каталогу тестируемого проекта System.getProperty("basedir"). Получите его и создайте файлы под управлением /target.

Более "подходящий" способ (поскольку у нас может быть вероятность, что мы настроили выходную директорию на что-то еще, вы можете изменить конфигурацию плагина surefire примерно так:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <systemPropertyVariables>
            <myOutDir>${project.build.outputDirectory}</myOutDir>
        </systemPropertyVariables>
    </configuration>
</plugin>

Затем вы можете получить фактический каталог вывода System.getProperty("myOutDir") в своем тесте.