You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MUnit中Mock SFTP List操作,使Foreach可访问其载荷与属性

Mock SFTP List 操作以获取文件名与路径属性(解决Foreach循环无法访问问题)

要解决Foreach循环中无法获取SFTP文件的文件名、路径属性的问题,核心是Mock SFTP客户端的列表查询方法,让它返回包含所需属性的结构化数据集合。以下是主流语言的实现示例:

Java 示例(Mockito)

首先定义封装文件名和路径的实体类,确保每个文件对象都能直接提供所需属性:

public class SftpFile {
    private String fileName;
    private String fullPath;

    public SftpFile(String fileName, String fullPath) {
        this.fileName = fileName;
        this.fullPath = fullPath;
    }

    // Getter方法,供Foreach循环调用
    public String getFileName() { return fileName; }
    public String getFullPath() { return fullPath; }
}

接着Mock SFTP客户端的listFiles方法,返回模拟的文件列表:

import org.mockito.Mockito;
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import static org.junit.Assert.assertEquals;

// 假设你的SFTP客户端接口定义
public interface SftpClient {
    List<SftpFile> listFiles(String remoteDirectory);
}

// 测试类中的Mock逻辑
public class SftpProcessorTest {
    @org.junit.Test
    public void testProcessSftpFiles() {
        // 创建Mock客户端实例
        SftpClient mockSftpClient = Mockito.mock(SftpClient.class);

        // 构造模拟的SFTP文件列表,包含文件名和完整路径
        List<SftpFile> mockFileList = Arrays.asList(
            new SftpFile("monthly_report.pdf", "/finance/reports/monthly_report.pdf"),
            new SftpFile("system.log", "/server/logs/system.log")
        );

        // 设定Mock行为:调用listFiles指定目录时返回模拟列表
        Mockito.when(mockSftpClient.listFiles("/")).thenReturn(mockFileList);

        // 业务逻辑中的Foreach循环,此时可以正常获取属性
        List<String> processedFileNames = new ArrayList<>();
        for (SftpFile file : mockSftpClient.listFiles("/")) {
            processedFileNames.add(file.getFileName());
            // 直接获取路径用于后续操作
            String filePath = file.getFullPath();
            System.out.println("正在处理文件:" + filePath);
        }

        // 验证结果正确性
        assertEquals(Arrays.asList("monthly_report.pdf", "system.log"), processedFileNames);
    }
}

Python 示例(pytest-mock)

Python中可以直接用字典模拟SFTP文件对象,灵活包含所需属性:

def test_sftp_file_processing(mocker):
    # 构造模拟的文件数据,包含文件名和完整路径
    mock_sftp_files = [
        {"file_name": "sales_data.csv", "full_path": "/data/sales/sales_data.csv"},
        {"file_name": "error.log", "full_path": "/data/errors/error.log"}
    ]

    # Mock Paramiko库的SFTPClient.listdir_attr方法,返回模拟数据
    def mock_listdir_attr(remote_dir):
        return mock_sftp_files

    mocker.patch("paramiko.SFTPClient.listdir_attr", side_effect=mock_listdir_attr)

    # 业务逻辑中的Foreach循环
    from paramiko import SFTPClient
    sftp_client = SFTPClient()
    for file in sftp_client.listdir_attr("/data"):
        print(f"文件名:{file['file_name']},路径:{file['full_path']}")
        # 这里可直接使用属性进行后续处理

关键要点

  • 不管用哪种语言,核心都是让Mock的list方法返回包含明确文件名、路径属性的对象/字典集合
  • 不需要修改第三方SFTP库的源码,只需Mock对应列表查询方法的返回值
  • 确保Foreach循环遍历的每个元素都能通过Getter方法(Java)或键名(Python)直接访问所需字段

内容的提问来源于stack exchange,提问作者PSAFOL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:25:08