如何使用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
相关产品推荐
相关产品推荐

