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

