PowerMockito带参静态方法Mock失效:指定方法Stub未执行求助
我来帮你排查这个问题!你遇到的核心问题是带参数的静态方法Stub方式不对,导致staticInput始终走真实实现,而不是你的自定义Stub逻辑。
问题原因分析
当你使用PowerMockito.mockStatic(Foo.class, Mockito.CALLS_REAL_METHODS)时,默认所有静态方法都会执行真实代码,除非你显式Stub覆盖。但Stub静态方法的方式有明确区别:
- 对于无参数的静态方法(比如
static1),你用的doReturn("dummy").when(Foo.class, "static1")是正确的——这种方式不会触发真实方法调用,直接完成存根。 - 对于带参数的静态方法(比如
staticInput),你用的when(Foo.staticInput(anyInt())).thenAnswer(...)是错误的:因为Foo.staticInput(anyInt())会实际执行一次真实的方法,而且在CALLS_REAL_METHODS模式下,这种Stub方式无法正确覆盖真实实现,导致后续调用还是走原始代码。
解决方案
把带参数静态方法的Stub方式改成doAnswer(...).when(Foo.class, "staticInput", anyInt())的形式,这样既不会触发真实方法调用,又能正确覆盖目标方法的逻辑。
修正后的完整测试代码
@RunWith(PowerMockRunner.class) @PrepareForTest({Foo.class }) public class TestMockito { @Test public void test() throws Exception { PowerMockito.mockStatic(Foo.class, Mockito.CALLS_REAL_METHODS); // 无参数静态方法的Stub(原方式正确,保留) PowerMockito.doReturn("dummy").when(Foo.class ,"static1"); // 带参数静态方法的Stub(修改为正确的语法) PowerMockito.doAnswer(invocation -> { int input = invocation.getArgument(0); System.out.println(input); return "staticInput mock"; }).when(Foo.class, "staticInput", anyInt()); // 执行测试调用 System.out.println(Foo.static1()); System.out.println(Foo.static2()); System.out.println(Foo.staticInput(7)); } }
预期输出
dummy static2 called 2 7 staticInput mock
修改后,static1走Stub逻辑,static2保持真实实现,staticInput执行你自定义的Stub逻辑,完全符合你的需求。
内容的提问来源于stack exchange,提问作者ankushbbbr
相关产品推荐
相关产品推荐

