You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 20:09:04