如何使用Mockito mock其他函数内部调用的Files.exists()或file.exists()方法
解决方案
方案1:使用Mockito静态Mock(推荐,Mockito 3.4+支持)
因为java.nio.file.Files的exists()是静态方法,你可以直接用Mockito提供的静态Mock能力实现需求,无需创建实际文件。
前置依赖
确保你的项目引入了符合版本要求的Mockito依赖,Maven配置示例如下:
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>4.11.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> <version>4.11.0</version> <scope>test</scope> </dependency>
测试代码示例
import java.nio.file.Files; import java.nio.file.Path; import org.mockito.MockedStatic; import org.mockito.junit.jupiter.MockitoExtension; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mockStatic; @ExtendWith(MockitoExtension.class) public class FooTest { @Test public void testFooWhenFileExists() { // 注意:静态Mock要放在try-with-resources代码块中,Mockito会在块执行结束后自动清理Mock状态,避免影响其他测试用例 try (MockedStatic<Files> mockedFiles = mockStatic(Files.class)) { // 配置mock规则:任意Path调用exists方法都返回true mockedFiles.when(() -> Files.exists(any(Path.class))).thenReturn(true); // 实例化你的业务类,调用foo方法 YourBusinessClass businessClass = new YourBusinessClass(); businessClass.foo(); // 这里添加断言,验证if分支内的逻辑执行符合预期 } } }
如果要更精准匹配getPath()返回的特定路径,可以把any(Path.class)替换为你实际预期的Path对象。
方案2:重构代码提升可测试性(无需Mock静态方法)
如果不想依赖静态Mock能力,可以把文件存在性检查的逻辑抽离为独立的可注入依赖,后续直接Mock这个依赖的实例方法即可:
- 抽离文件操作工具类
public class FileOperator { public boolean exists(Path path) { return Files.exists(path); } }
- 改造原有业务类,通过构造传入FileOperator
public class YourBusinessClass { private final FileOperator fileOperator; public YourBusinessClass(FileOperator fileOperator) { this.fileOperator = fileOperator; } protected void foo() { Path jsonPath = getPath(); if (fileOperator.exists(jsonPath)) { // Code to test... } } }
- 测试时直接Mock FileOperator即可
import org.mockito.junit.jupiter.MockitoExtension; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) public class FooTest { @Mock private FileOperator fileOperator; @InjectMocks private YourBusinessClass businessClass; @Test public void testFooWhenFileExists() { when(fileOperator.exists(any(Path.class))).thenReturn(true); businessClass.foo(); // 后续断言逻辑 } }
内容的提问来源于stack exchange,提问作者Aquib Zulfikar
相关产品推荐
相关产品推荐

