12

我需要用 Java 测试 FTP/FTPS/SFTP/本地文件系统协议。

我需要一个可以在任何这些方法中使用的模拟服务器。

我可以找到一个 MockFTPServer。据我了解,它只能用于简单的FTP协议,不能用于FTPS/SFTP/Local File System。

任何人都可以建议是否有任何模拟实现可用于支持 Java 中的 FTP/FTPS/SFTP/本地文件系统的服务器?

谢谢,

维杰·博尔

4

2 回答 2

8

假 SFTP 服务器规则。它是 JUnit 4 的规则/库,在测试期间运行 SFTP 服务器。它提供了方便的方法来帮助您将文件放到服务器上并从中获取文件。

完全披露:我是 Fake SFTP 服务器规则的作者。

于 2018-03-27T19:10:32.773 回答
2

这些问题有点老,但无论如何我都会发布我的答案,因为它也可能对其他人有所帮助。

我写了一篇关于如何使用 Testcontainers 和 atmoz/sftp Docker 映像创建模拟 sftp 服务器的文章,它也适用于您的其他要求。

完整的例子可以在这里看到

你会像这样用 SFTP 定义你的 TestContainer

 private static final GenericContainer sftp = new GenericContainer(
            new ImageFromDockerfile()
                    .withDockerfileFromBuilder(builder ->
                            builder
                                    .from("atmoz/sftp:latest")
                                    .run("mkdir -p /home/" + USER + "/upload; chmod -R 007 /home/" + USER)
                                    .build()))
            //.withFileSystemBind(sftpHomeDirectory.getAbsolutePath(), "/home/" + USER + REMOTE_PATH, BindMode.READ_WRITE) //uncomment to mount host directory - not required / recommended
            .withExposedPorts(PORT)
            .withCommand(USER + ":" + PASSWORD + ":1001:::upload");

当您需要 FTPS 服务器或任何其他协议时,您可以选择另一个像这样的图像并调整容器配置。https://hub.docker.com/r/bozorgiyan/ftps-server

至于本地文件系统,我不确定是否有什么特殊要求。使用 JUnit 5,您可以像这样轻松地创建一个临时目录

@TempDir
File mockFileSystemDirectory;

你可以创建一个 util 类来重写你到那个目录的路径,如下所示:

public static File convertToFakeFileSystem(File yourFile, File fakeFileSystem) {
    return new File(fakeFileSystem.getAbsolutePath() + yourFile
            .getAbsolutePath()
            .replaceAll("C://", "/"));
}
于 2021-04-30T10:50:09.780 回答