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

如何简化Mockito中多个方法返回相同值的存根写法?

Mockito 批量设置方法返回空Optional的简洁写法

方案1:全局匹配所有返回Optional的方法

如果你的Dog类中所有返回Optional类型的方法都需要返回Optional.empty(),可以通过自定义Answer一次性配置:

方式1:初始化时动态设置

Dog dog = mock(Dog.class);
Mockito.when(dog.*(any())).thenAnswer(invocation -> {
    Method method = invocation.getMethod();
    if (Optional.class.equals(method.getReturnType())) {
        return Optional.empty();
    }
    // 非Optional类型方法沿用Mockito默认行为
    return Mockito.RETURNS_DEFAULTS.answer(invocation);
});

方式2:通过@Mock注解指定默认Answer

先定义自定义Answer类:

public class EmptyOptionalAnswer implements Answer<Object> {
    @Override
    public Object answer(InvocationOnMock invocation) throws Throwable {
        Method method = invocation.getMethod();
        if (Optional.class.equals(method.getReturnType())) {
            return Optional.empty();
        }
        return Answers.RETURNS_DEFAULTS.answer(invocation);
    }
}

然后在Mock实例上指定:

@Mock(answer = EmptyOptionalAnswer.class)
private Dog dog;

这种方式一劳永逸,无需逐个方法配置,适合需要统一处理所有Optional返回方法的场景。

方案2:针对指定方法批量配置

如果只需要让tail()、paw()等特定方法返回空Optional,可以利用Mockito的Stubber链式调用特性,减少重复代码:

doReturn(Optional.empty())
    .when(dog).tail()
    .when(dog).paw()
    .when(dog).ear(); // 继续添加需要配置的方法

相比每次单独写when(dog.tail()).thenReturn(Optional.empty()),这种链式写法更简洁,减少了重复的返回值配置代码。

注意事项

  • 使用方案1时,要确认确实需要所有返回Optional的方法都返回空值,避免影响其他需要正常Mock的方法。
  • Java记录类(Record)的Mock行为与普通类一致,上述方案均适用。

内容的提问来源于stack exchange,提问作者S.Dan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 12:42:39