Mock Log4j2自定义Appender带参静态方法出现报错该如何解决
问题原因
- 核心问题是Mockito参数匹配器不允许混合使用字面量和匹配器:你在stub
createAppender方法时,第一个参数传入了字面量"myAppender",第二个参数用了Mockito.any(Layout.class)匹配器。Mockito规则要求只要有一个参数使用匹配器,所有参数都必须使用匹配器,否则会导致匹配器栈状态错乱,无法正确识别你要stub的目标方法,进而出现把其他方法(比如toString)误识别为待stub方法的异常。 - 第二个
MissingMethodInvocationException异常也是同理:anyObject()的使用不符合匹配器规则,导致Mockito没有识别到有效的mock对象方法调用。
正确的实现方式
首先确保你已经引入了mockito-inline依赖(Mockito 3.4及以上版本才支持静态方法mock,且必须使用inline依赖才能开启静态类mock能力),然后修改stub代码,统一参数匹配规则即可:
try (MockedStatic<MyAppender> mocked = Mockito.mockStatic(MyAppender.class)) { MyAppender appender = Mockito.mock(MyAppender.class); // 固定值参数用eq()包裹,所有参数统一使用匹配器 mocked.when(() -> MyAppender.createAppender(Mockito.eq("myAppender"), Mockito.any(Layout.class))) .thenReturn(appender); // 后续业务测试逻辑 }
如果你不需要限制第一个参数的取值,也可以两个参数都用通配匹配器:
mocked.when(() -> MyAppender.createAppender(Mockito.anyString(), Mockito.any(Layout.class))) .thenReturn(appender);
内容的提问来源于stack exchange,提问作者Johnyb
相关产品推荐
相关产品推荐

