为了账号安全,请及时绑定邮箱和手机立即绑定

如何模拟文件系统功能

如何模拟文件系统功能

拉莫斯之舞 2022-06-04 16:59:50
我不知道如何模拟我将文件所有者从行Path path = newFile.toPath();更改到末尾的部分。这是我的功能:@RequestMapping(value = "/upload", method = RequestMethod.POST)    @ResponseBody    public String uploadEndpoint(@RequestParam("file") MultipartFile file,                                 @RequestParam("usernameSession") String usernameSession,                                 @RequestHeader("current-folder") String folder) throws IOException {        String[] pathArray = file.getOriginalFilename().split("[\\\\\\/]");        String originalName = pathArray[pathArray.length-1];        LOGGER.info("Upload triggerred with : {} , filename : {}", originalName, file.getName());        String workingDir = URLDecoder.decode(folder.replace("!", "."),                StandardCharsets.UTF_8.name())                .replace("|", File.separator);        LOGGER.info("The file will be moved to : {}", workingDir);        File newFile = new File(workingDir + File.separator + originalName);        //UserPrincipal owner = Files.getOwner(newFile.toPath());        file.transferTo(newFile);        Path path = newFile.toPath();        FileOwnerAttributeView foav = Files.getFileAttributeView(path, FileOwnerAttributeView.class);        UserPrincipal owner = foav.getOwner();        System.out.format("Original owner  of  %s  is %s%n", path, owner.getName());    }这是测试:@Test    public void uploadEndpointTest() throws Exception {        PowerMockito.whenNew(File.class).withAnyArguments().thenReturn(file);        Mockito.when(multipartFile.getOriginalFilename()).thenReturn("src/test/resources/download/test.txt");        assertEquals("ok", fileExplorerController.uploadEndpoint(multipartFile, "userName", "src/test/resources/download"));    }我遇到了一个例外,因为“userName”不是用户。我想模拟它在 Windows 用户中寻找匹配项的调用。当我设置我的窗口的用户名而不是“userName”时它可以工作,但我不能让我的窗口的用户名。我试图嘲笑fs.getUserPrincipalLookupService();但upls.lookupPrincipalByName(usernameSession);我不知道要返回什么来模拟通话。
查看完整描述

1 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

首先,您应该考虑单一职责原则并进一步剖析您的代码。

含义:创建一个帮助类,为您抽象所有这些低级文件系统访问。然后在此处提供该助手类的模拟实例,并确保使用预期参数调用助手方法。这将使您的服务方法uploadEndpoint()更容易测试。

然后,您的助手类可以简单地期望一个 File 对象。这使您能够将模拟的 File 对象传递它,并且突然之间您可以控制thatMockedFileObject.newPath()将返回的内容。

换句话说:您的第一个目标应该是编写不使用staticnew()以防止使用 Mockito 进行简单模拟的方式的代码。每当您遇到您认为“我需要 PowerMock(ito) 来测试我的生产代码”的情况时,第一个冲动应该是:“我应该避免这种情况,并改进我的设计”。

同样的FileSystem fs = FileSystems.getDefault();......而不是试图进入“模拟静态调用业务”,你确保你的帮助类接受一些 FileSystem 实例。突然之间,您可以传递一个简单的 Mockito 模拟对象,并且您可以完全控制它。


查看完整回答
反对 回复 2022-06-04
  • 1 回答
  • 0 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信