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

如何使用BDDMockito存根接口中的默认方法?

解决BDDMockito存根接口默认方法时调用真实实现的问题

问题原因

使用given(spy.put(any())).willAnswer(...)这种BDDMockito语法时,会先执行一次spy.put(any())来创建存根的方法调用点,而Mockito的Spy对于接口的默认方法,在直接调用时会执行真实的默认实现,因此导致你的断言和自定义逻辑执行前,真实的默认方法已经被调用了。

而你之前用doAnswer(i -> ...).when(spy).put(any())的写法不会触发真实方法,是因为这种方式是先定义存根行为,再绑定到目标方法,不会提前执行真实方法。

解决方案

改用BDDMockito的反向BDD语法,先指定存根的willAnswer行为,再绑定到Spy的目标方法上,这样就不会触发真实的默认方法执行。代码示例如下:

BDDMockito.willAnswer(i -> {
    ByteBuffer buffer = i.getArgument(0);
    assert buffer != null;
    print(buffer);
    assert buffer.capacity() == BYTES;
    assert buffer.limit() == buffer.capacity();
    assert buffer.remaining() == BYTES;
    buffer.position(buffer.limit());
    return buffer;
}).given(spy).put(any());

补充说明

这种写法和你之前使用的doAnswer().when()逻辑完全等价,只是转换成了BDDMockito的风格,既保留了BDD的可读性,又避免了触发接口的默认方法实现。

内容的提问来源于stack exchange,提问作者Jin Kwon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:50:10