如何在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
相关产品推荐
相关产品推荐

