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

Java 8单元测试:如何Stub MapStruct接口的默认void方法?

解决MapStruct接口默认方法Stub失效问题

核心原因

Mockito 默认不会拦截接口的默认方法调用——当你 mock 一个接口时,生成的代理类会优先执行接口中默认方法的实际逻辑,而非你通过 doNothing() 定义的 stub 行为。

具体解决方案

  • 升级 Mockito 版本
    从 Mockito 2.23.0 版本开始,官方支持对接口默认方法的 stub 处理。如果你的版本低于这个范围,直接升级到 2.23.0+ 后,原有的 Mockito.doNothing().when(object).method() 写法应该就能生效。

  • 自定义 Answer 覆盖默认方法逻辑
    若无法升级版本,可通过自定义 Answer 来拦截默认方法调用,让其不执行实际逻辑:

    YourMapStructInterface mockMapper = Mockito.mock(YourMapStructInterface.class, invocation -> {
        Method method = invocation.getMethod();
        // 判断当前调用的是默认方法
        if (method.isDefault()) {
            // void 方法返回 null 即可跳过实际执行
            return null;
        }
        // 非默认方法沿用 Mockito 原生 mock 行为
        return Mockito.RETURNS_DEFAULTS.answer(invocation);
    });
    
  • 创建空实现类替代默认方法
    手动编写一个实现 MapStruct 接口的空类,重写目标 void 方法并什么都不做:

    public class EmptyMapperImpl implements YourMapStructInterface {
        @Override
        public void yourVoidTargetMethod(Source source, Target target) {
            // 空实现,不执行任何逻辑
        }
    }
    

    测试时直接使用这个类的实例,或者对它进行 mock,调用时就不会触发原接口的默认方法逻辑。

  • Spy MapStruct 生成的实现类
    如果你已经有 MapStruct 生成的接口实现类(通常命名为 XXXImpl),可以用 Spy 包装它,再 stub 目标方法:

    YourMapStructInterface mapperSpy = Mockito.spy(new YourMapStructImpl());
    Mockito.doNothing().when(mapperSpy).yourVoidTargetMethod(any(), any());
    

    Spy 默认会执行真实方法,但被 stub 的方法会跳过实际逻辑。

内容的提问来源于stack exchange,提问作者ravi saurav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:55:24