如何模拟同一工具类中被静态方法调用的另一个静态方法?求示例
实现示例:Mock工具类中被调用的静态方法,保留目标方法真实逻辑
没问题,我来给你举个具体的实现例子,用Mockito就能轻松搞定这个需求!先假设你的工具类结构大概是这样的:
示例工具类代码
public class StringUtils { // 你不想Mock的目标方法,要执行真实逻辑 public static String processInput(String input) { // 你想要Mock的被调用方法 String cleanedContent = cleanInput(input); return "最终处理结果:" + cleanedContent; } // 需要Mock的静态方法 public static String cleanInput(String input) { // 真实业务逻辑:比如去除空格、特殊字符 return input.trim().replaceAll("[^\\w]", ""); } }
测试类实现(用JUnit 5 + Mockito 3.4.0+)
import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; import static org.mockito.Mockito.*; import static org.junit.jupiter.api.Assertions.*; public class StringUtilsTest { @Test void testProcessInputWithMockedCleanInput() { // 测试用的输入和预设的Mock返回值 String testInput = " 测试@内容#$ "; String mockedCleanResult = "测试内容"; // 用MockedStatic静态Mock工具类,只指定要Mock的方法行为 try (MockedStatic<StringUtils> mockedUtils = mockStatic(StringUtils.class)) { // 设置:当调用cleanInput(testInput)时,返回我们预设的结果 mockedUtils.when(() -> StringUtils.cleanInput(testInput)) .thenReturn(mockedCleanResult); // 调用目标方法processInput——这个方法会执行真实逻辑,但内部调用的cleanInput是Mock的 String finalResult = StringUtils.processInput(testInput); // 验证结果是否符合预期 assertEquals("最终处理结果:测试内容", finalResult); // 验证cleanInput确实被调用了一次 mockedUtils.verify(() -> StringUtils.cleanInput(testInput), times(1)); } } }
关键要点说明
- 用
MockedStatic来实现静态方法的Mock,这是Mockito 3.4.0及以上版本提供的特性,不需要额外依赖PowerMock - 通过
when(...).thenReturn(...)仅对cleanInput方法设置Mock行为,processInput因为没有被Mock,会执行真实的代码逻辑 - 用
try-with-resources语法包裹MockedStatic,能确保测试结束后自动关闭Mock,避免影响其他测试用例
内容的提问来源于stack exchange,提问作者user447607
相关产品推荐
相关产品推荐

