Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何模拟sftp会话_Java_Junit_Sftp - Fatal编程技术网

Java 如何模拟sftp会话

Java 如何模拟sftp会话,java,junit,sftp,Java,Junit,Sftp,我正在更新一些测试。在获取sftp会话之前。为此,用户名和密码已在属性文件中硬编码。由于安全原因,密码无法签入,必须取消。但是,单元测试在以下位置失败: private DefaultSftpSessionFactory sftpClientFactory; private SftpSession sftpSession; @Before public void setup() { sftpSession = sftpClientFactory.getSession();

我正在更新一些测试。在获取sftp会话之前。为此,用户名和密码已在属性文件中硬编码。由于安全原因,密码无法签入,必须取消。但是,单元测试在以下位置失败:

private DefaultSftpSessionFactory sftpClientFactory;
private  SftpSession sftpSession;

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

此步骤因“需要密码或私钥”而失败。我希望获得模拟会话,以便不必提供密码。

关于未回答/无法回答的问题,模拟方法是:

  • 将所需的库放入(测试)类路径中。()

  • 嘲笑SftpSession。(通过注释
    private@Mock SftpSession SftpSession;
    …加上相应的,或(手动)通过
    SftpSession=Mockito.Mock(SftpSession.class);

    a。请参阅,是否需要SessionFactory(用于测试),如果需要,也可以使用mock

  • 模拟/验证/重置(测试中)与模拟对象的任何交互。(如
    Mockito.when(sftpSession.foo(x,y,z))。然后…
    Mockito.verify(sftpSession,Mockito.times(n)).foo(x,y,z);

  • 进一步阅读:


    我不知道所讨论的测试的目的,但是作为模拟的替代方案,我可以建议对一个功能齐全的SFTP服务器进行测试,就像最初打算的那样

    诀窍是使用Docker和一些类似java库的Docker支持

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

    如果您使用的是JUnit 5 Jupiter(可能也很容易适应JUnit 4),我已经写了一篇关于如何使用atmoz/sftp Docker映像和Testcontainers来实现这一点的文章

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

    这就是使用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");