我的应用程序我正在使用名为“消息”的 sqlite 数据库。为了测试功能,我编写了一个功能测试。测试调用执行以下操作的控制器:
- 删除所有现有记录(测试 BeforeEach 方法)
- 加载 csv 文件(控制器调用服务的实际功能)
- 删除所有记录(测试 AfterEach 方法)
因为它是产品数据库,所以我想在测试运行之前保留实际数据,所以我使用以下代码:
@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 是产品数据,所以我试图在测试开始之前对其进行备份,并且在所有测试完成后,我将其移动到原始数据库名称。
但是当我尝试这样做时,我收到以下错误:
messages_lookup_db\messages.db:该进程无法访问该文件,因为它正被另一个进程使用。
java.nio.file.FileSystemException: messages_lookup_db\messages.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
,但这个问题仍然存在。
我在这里做错了什么吗?
问候