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
相关产品推荐
相关产品推荐

