我需要测试FTP/FTPS/SFTP/Java本地文件系统协议。我需要一个模拟服务器,可用于任何这些方法。我可以找到一个MockFTPServer,据我所知,它只能用于简单的FTP协议,不能用于FTPS/SFTP/本地文件系统。有人能建议是否有任何模拟实现可用于服务器,支持FTP/FTPS/SFTP/本地文件系统的Java?谢谢你,维贾伊·博尔
inkz8wg91#
有Fake SFTP server rule,它是JUnit 4的一个规则/库,在测试时运行SFTP服务器,它提供了方便的方法,帮助您将文件放到服务器上,并从服务器上获取文件。完全披露:我是Fake SFTP服务器规则的作者。
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://", "/")); }
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();
3条答案
按热度按时间inkz8wg91#
有Fake SFTP server rule,它是JUnit 4的一个规则/库,在测试时运行SFTP服务器,它提供了方便的方法,帮助您将文件放到服务器上,并从服务器上获取文件。
完全披露:我是Fake SFTP服务器规则的作者。
s2j5cfk02#
问题是有点老,但我张贴我的答案无论如何,因为它可能会帮助别人以及。
我已经编写了一个article,介绍如何使用Testcontainers和atmoz/sftp Docker映像创建模拟sftp服务器,它也可以适应您的其他需求。
完整示例可参见here
您可以像这样使用SFTP定义TestContainer
当您需要FTPS服务器或任何其他协议时,您可以选择另一个类似的映像,并调整容器配置。https://hub.docker.com/r/bozorgiyan/ftps-server
至于本地文件系统,我不确定是否有什么特别的要求,使用JUnit 5你可以很容易地创建一个临时目录
你可以创建一个util类来重写你到那个目录的路径,如下所示:
7lrncoxx3#
是的,模拟SFTP服务器的最佳选择是使用TestContainers,但我仍想对前面的答案补充一些意见。
现在,我们可以使用映像名称 atmoz/sftp。还可以使用 withCopyFileToContainer 方法,该方法与 docker cp 命令非常相似。
**注意:**当使用 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中执行命令,来验证文件是否正确地上传到了给定的位置。