junit 如何模拟sftp会话

wmvff8tz  于 2022-12-13  发布在  其他
关注(0)|答案(4)|浏览(205)

我正在更新一些测试。Before获得了sftp会话。为此,用户名和密码已经被硬编码在属性文件中。由于安全原因,密码不能被签入,必须被清空。然而,单元测试在

private DefaultSftpSessionFactory sftpClientFactory;
private  SftpSession sftpSession;

 @Before
 public void setup() {
    sftpSession = sftpClientFactory.getSession();
    
}

此步骤失败,并显示“需要密码或私钥”。我希望获得一个模拟会话,这样我就不必提供密码。

42fyovps

42fyovps1#

如果您使用的是JUnit 5 Jupiter(可能也很容易适用于JUnit 4),我已经编写了一个article,说明如何使用atmoz/sftp Docker映像和Testcontainers来实现这一点。

完整的工作示例可在此处找到

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");
dgsult0t

dgsult0t2#

对于未回答/能够回答的问题What's the best mock framework for Java?,Mockito方法为:
1.将所需的库放入(测试)类路径中。(https://mvnrepository.com/artifact/org.mockito
1.模拟SftpSession。(通过注解private @Mock SftpSession sftpSession;...加上相应的initialization/enablement,或者(手动)通过sftpSession = Mockito.mock(SftpSession.class);
a.查看是否需要SessionFactory(用于测试),如果需要,还需要mock。
1.模拟/验证/重置与模拟对象的任何交互(在您的测试中)。(如Mockito.when(sftpSession.foo(x,y,z)).then...Mockito.verify(sftpSession, Mockito.times(n)).foo(x,y,z);
进一步阅读:

nxagd54h

nxagd54h3#

我不知道这个测试的目的,但是作为嘲笑的替代方法,我可以建议在一个功能齐全的SFTP服务器上进行测试,就像最初打算的那样。
诀窍是使用Docker和一些支持Docker的java库,如Testcontainers

  • 选择一个SFTP服务器Docker映像(atmoz/sftp可能值得一试--从星数和下载量来判断)--确保它易于配置(在atmoz/sftp中,用户可以使用环境变量进行配置--参见文档)。
  • 使用Testcontainers设置测试中的服务器(可以使用GenericContainer#addEnv设置容器的环境变量)。有关详细信息,请参阅Junit 4Junit Jupiter的快速入门手册。
vsmadaxz

vsmadaxz4#

jannishere所述,更好的替代方案是使用功能完备的测试SFTP环境。

**为什么?**因为模拟逻辑需要大量的样板文件,并且不允许完全测试应用程序及其移动部分。幸运的是,测试容器支持足够成熟,可以用于您的情况。

SpringBoot环境中的SFTP测试容器可以很容易地设置如下:

@SpringBootTest
class SshClientDemoApplicationTests {

    @Container
    static final GenericContainer<?> SFTP = new GenericContainer<>("atmoz/sftp:latest")
            .withExposedPorts(22)
            .withCreateContainerCmdModifier(cmd -> cmd.withHostConfig(
                    new HostConfig().withPortBindings(new PortBinding(Ports.Binding.bindPort(22), new ExposedPort(22)))
            ))
            .withCommand("user:pass:::home");

    @BeforeAll
    static void start() throws IOException {
        SFTP.start();
    }

    @AfterAll
    static void stop() {
        SFTP.stop();
    }
}

完整的Sping Boot 应用程序可通过here下载。

相关问题