Mockito匹配Paths.get生成的Path对象失败问题求助
解决Mockito中Path对象匹配失败的问题
问题根源
Path对象的equals方法并非单纯对比路径字符串,而是依赖其所属的FileSystem实例。如果测试代码中生成的Path与主逻辑传入的Path不属于同一个FileSystem,即便路径字符串完全一致,equals也会返回false,导致eq()匹配失效。而same()是直接比较对象引用,测试和主逻辑的Path肯定不是同一实例;refEq()会对比对象内部字段,但Path的实现类包含FileSystem引用,同样会因为FileSystem不同匹配失败。
解决办法
1. 自定义参数匹配器(argThat)
直接基于路径字符串或规范化路径做匹配,绕过FileSystem的影响:
// 简单匹配路径字符串 when(foo.bar(argThat(path -> "/path/to/file".equals(path.toString())))).thenReturn(true); // 更严谨的规范化路径匹配(处理路径中的.或../等情况) when(foo.bar(argThat(path -> Paths.get("/path/to/file").normalize().equals(path.normalize())))).thenReturn(true);
2. 使用参数捕获器(ArgumentCaptor)
先让mock方法返回预期值,再捕获传入的Path参数做验证:
// 先设置任意Path参数都返回true when(foo.bar(any(Path.class))).thenReturn(true); // 执行主逻辑代码... // 捕获参数并验证路径 ArgumentCaptor<Path> pathCaptor = ArgumentCaptor.forClass(Path.class); verify(foo).bar(pathCaptor.capture()); assertEquals("/path/to/file", pathCaptor.getValue().toString());
3. 动态判断的Answer接口
在方法调用时实时检查传入的Path参数,返回对应结果:
when(foo.bar(any(Path.class))).thenAnswer(invocation -> { Path inputPath = invocation.getArgument(0); // 可根据需要调整匹配逻辑,比如规范化后对比 return "/path/to/file".equals(inputPath.normalize().toString()); });
内容的提问来源于stack exchange,提问作者kushal agrawal
相关产品推荐
相关产品推荐

