Как создать резервную копию и восстановить базу данных sqlite во время выполнения функционального теста Micronaut

#sqlite #functional-testing #micronaut #file-copying #micronaut-test

Вопрос:

В своем приложении я использую базу данных sqlite с именем «сообщение». Чтобы проверить функциональность, я написал функциональный тест. Тестовый вызов контроллера, который выполняет следующие действия:

  1. удалите все существующие записи (метод проверки перед началом)
  2. загрузите файл csv (фактическая функциональность, вызываемая контроллером для обслуживания)
  3. удалите все записи (метод проверки после завершения)

Поскольку это база данных prod, я хочу сохранить фактические данные перед тестовыми запусками, поэтому я использую следующий код:

     @BeforeAll
    @SneakyThrows
    static void backupExistingData(){
        Thread.sleep(1000);
        Path sourceFile = Path.of("messages_lookup_db/messages.db");
        Path targetFile = Path.of("messages_lookup_db/messages_backup.db");
        Path target =  Files.copy(sourceFile, targetFile,StandardCopyOption.REPLACE_EXISTING);
        System.out.println(target.getFileName());
        Thread.sleep(1000);
    }

    @BeforeEach
    void setup() {
        dao.deleteAll();
    }

    @AfterEach
    void cleanUpDatabase() {
        dao.deleteAll();
    }

    @AfterAll
    @SneakyThrows
    static void restoreExistingData(){
        Thread.sleep(1000);
        Path sourceFile = Path.of("messages_lookup_db/messages_backup.db");
        Path targetFile = Path.of("messages_lookup_db/messages.db");
        Files.move(sourceFile, targetFile, StandardCopyOption.REPLACE_EXISTING);
    }
 

Мой файл DAO выглядит так:

 @Repository(value = "messagesdb")
@JdbcRepository(dialect = Dialect.ANSI)
public interface MessageDao extends CrudRepository<MessageEntity, String> {
    @Executable
    @Retryable
    Optional<String> findMessageCodesByCountry(String country);
}
 

Здесь message.db-это данные prod, поэтому я пытаюсь создать их резервную копию перед началом тестирования, и после завершения всех тестов я перемещаю их в исходное имя базы данных.

но когда я пытаюсь это сделать, я получаю следующую ошибку:

messages_lookup_dbmessages.db: The process cannot access the file because it is being used by another process.

 java.nio.file.FileSystemException: messages_lookup_dbmessages.db: The process cannot access the file because it is being used by another process.

    at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:92)
    at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)
    at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108)
    at java.base/sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:384)
    at java.base/sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:292)
    at java.base/java.nio.file.Files.move(Files.java:1422)
    at com.tesco.MessageFunctionTest.restoreExistingData(MessageFunctionTest.java:58)
 

Я даже использовал Thread.sleep , но все равно эта проблема остается постоянной.

Есть ли что-то не так, что я здесь делаю ?

С уважением