Mockito 4.11.0如何Mock类静态方法且保留实例方法正常执行?
解决方案:Mock静态方法并保留其他实例方法正常执行
核心思路
Mockito 4.11.0支持静态方法Mock,通过mockStatic()创建静态Mock上下文,同时使用真实的ABC实例确保其他非静态方法正常执行,避免Mock整个实例导致其他方法失效。
步骤与代码示例
1. 目标类ABC(示例)
public class ABC { public static void staticOne() { // 原业务逻辑 } public void method1() { staticOne(); // method1自身的业务逻辑 } public String method2() { return "原method2返回值"; } }
2. 测试用例实现
import org.junit.jupiter.api.Test; import static org.mockito.Mockito.*; public class ABCTest { @Test void testMethod1_MockStaticOne_KeepOtherMethods() { // 初始化真实的ABC实例,确保method2等非静态方法执行原逻辑 ABC realABCInstance = new ABC(); // 使用try-with-resources自动管理静态Mock的生命周期,防止污染其他测试 try (MockedStatic<ABC> mockedStaticABC = mockStatic(ABC.class)) { // Mock静态方法staticOne,指定替代原逻辑的行为(这里是啥都不做) mockedStaticABC.when(ABC::staticOne).doNothing(); // 执行要测试的method1 realABCInstance.method1(); // 验证静态方法staticOne被调用了一次 mockedStaticABC.verify(ABC::staticOne, times(1)); } // 验证其他实例方法method2正常执行原逻辑 assert realABCInstance.method2().equals("原method2返回值"); } }
关键注意事项
- 静态Mock的生命周期:必须用
try-with-resources包裹mockStatic()的返回值,静态Mock是全局生效的,用完自动关闭才能避免影响其他测试用例。 - 使用真实实例:不能Mock ABC的实例,否则
method2()等非静态方法也会被Mock,无法执行原逻辑。 - void静态方法的Mock:对于无返回值的静态方法,用
doNothing()替代原逻辑,也可以根据需求自定义行为(比如抛出异常)。
内容的提问来源于stack exchange,提问作者Ujef Malek
相关产品推荐
相关产品推荐

