如何解决如何模拟SFTP会话
我正在更新一些测试。之前获取sftp会话。为此,用户名和密码已在属性文件中进行了硬编码。出于安全原因,密码无法签入,必须将其清空。但是单元测试失败了
private DefaultSftpSessionFactory sftpClientFactory;
private SftpSession sftpSession;
@Before
public void setup() {
sftpSession = sftpClientFactory.getSession();
}
此步骤失败,显示“需要密码或私钥”。我想进行模拟会话,因此不必提供密码。
解决方法
如果您使用的是 JUnit 5 Jupiter(也可能很容易适应 JUnit 4),我已经写了一篇关于如何使用 atmoz/sftp Docker 映像和 Testcontainers 来做到这一点的article。>
完整的工作示例可以在这里找到
https://overflowed.dev/blog/sftp-testing-junit-testcontainers-atmoz-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");
,
关于悬而未决的问题What's the best mock framework for Java?,采用Mockito方法是:
-
将所需的库放入(测试)类路径。 (https://mvnrepository.com/artifact/org.mockito)
-
模拟SftpSession。 (通过注释
private @Mock SftpSession sftpSession;
...加上相应的initialization/enablement,或者(手动)通过sftpSession = Mockito.mock(SftpSession.class);
)a。看看是否完全需要SessionFactory(用于测试),如果需要的话也可以模拟。
-
模拟/验证/重置与模拟对象的任何交互(在测试内)。 (例如
Mockito.when(sftpSession.foo(x,y,z)).then...
或Mockito.verify(sftpSession,Mockito.times(n)).foo(x,z);
)
进一步阅读:
,我不知道测试的目的,但是作为模拟的替代方法,我建议按照最初的意图针对功能齐全的SFTP服务器进行测试。
诀窍是使用Docker和一些支持Docker的Java库,例如Testcontainers。
- 选择SFTP服务器Docker映像({* {3}}可能值得一试-从星标和下载数量来看)-确保它易于配置(在
atmoz/sftp
中,用户可以使用环境进行配置vars-请参阅文档)。 - 使用Testcontainers在测试中设置服务器(可以使用atmoz/sftp设置容器的环境变量)。有关详细信息,请查阅GenericContainer#addEnv和Junit 4的快速入门手册。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。