在Java中模拟SFTP、FTP、FTPS、本地文件系统服务器

ar7v8xwq  于 2023-03-11  发布在  Java
关注(0)|答案(3)|浏览(294)

我需要测试FTP/FTPS/SFTP/Java本地文件系统协议。
我需要一个模拟服务器,可用于任何这些方法。
我可以找到一个MockFTPServer,据我所知,它只能用于简单的FTP协议,不能用于FTPS/SFTP/本地文件系统。
有人能建议是否有任何模拟实现可用于服务器,支持FTP/FTPS/SFTP/本地文件系统的Java?
谢谢你,
维贾伊·博尔

inkz8wg9

inkz8wg91#

Fake SFTP server rule,它是JUnit 4的一个规则/库,在测试时运行SFTP服务器,它提供了方便的方法,帮助您将文件放到服务器上,并从服务器上获取文件。
完全披露:我是Fake SFTP服务器规则的作者。

s2j5cfk0

s2j5cfk02#

问题是有点老,但我张贴我的答案无论如何,因为它可能会帮助别人以及。
我已经编写了一个article,介绍如何使用Testcontainers和atmoz/sftp Docker映像创建模拟sftp服务器,它也可以适应您的其他需求。

完整示例可参见here

您可以像这样使用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://", "/"));
}
7lrncoxx

7lrncoxx3#

是的,模拟SFTP服务器的最佳选择是使用TestContainers,但我仍想对前面的答案补充一些意见。
现在,我们可以使用映像名称 atmoz/sftp。还可以使用 withCopyFileToContainer 方法,该方法与 docker cp 命令非常相似。

// to initialize sftp server container
GenericContainer<?> sftpContainer = new GenericContainer<>(DockerImageName.parse("atmoz/sftp"))
        .withExposedPorts(22)
        .withEnv("SFTP_USERS", TEST_SFTP_USERNAME + ":" + TEST_SFTP_PASSWORD)
        .withCopyFileToContainer(
                MountableFile.forHostPath("src/test/resources/sftpFiles"),
                "/home/" + TEST_SFTP_USERNAME + "/SHOP/"
        );
sftpContainer.start();

**注意:**当使用 withCopyFileToContainer 上传文件时,我们应该通过附加/home/来给予容器路径<username_we_log_in_while_SSH>,如给定的示例所示。否则,当我们使用SSH测试控制器读取文件时,可能会发生以下异常。

net.schmizz.sshj.sftp.SFTPException:无此文件
2没有此类文件
这是因为,当我们SSH测试容器时,它会在路径/home/中搜索<username_we_log_in_while_SSH>
我们可以使用相同的testcontainer和 execInContainer 方法在testcontainer中执行命令,来验证文件是否正确地上传到了给定的位置。

sftpContainer.execInContainer("ls","home/<username_we_log_in_while_SSH>").getStdout();

相关问题