Mockito的doCallRealMethod在返回值为void的方法上不生效问题
问题:使用@Mock/@Spy注解时,无法触发void方法的真实逻辑
我尝试调用一个返回值为void的真实方法,分别给Bean加了@Mock和@Spy注解,但始终进不了实际类的方法逻辑。
业务代码
@Autowired private HelperV2 authValidationHelper; @Override public void postProcess(Event event) { List<Error> errorList = new ArrayList<>(); authValidationHelper.validateOrderTotalAmount(event, errorList); handleError(event, errorList); }
测试用例
@Spy private HelperV2 authValidationHelper; @Test public void test_postProcess() { BaseOrderEvent event = ParserUtil.getObjectFromFile( "events/createPaymentRequestWithShoppingCardOnly2.json", Event.class); Mockito.doCallRealMethod() .when(authValidationHelper) .validateOrderTotalAmount(Mockito.any(), Mockito.any()); createOrderEventProcessor.postProcess(event); }
解决方案
确保被测试类
createOrderEventProcessor注入的是你定义的@Spy实例
给测试类中的createOrderEventProcessor加上@InjectMocks注解,Mockito会自动把@Spy的authValidationHelper注入进去,避免Spring注入原始Bean导致Spy实例未被使用。确认
doCallRealMethod()的语法正确
对于void方法,必须使用doCallRealMethod().when(实例).方法名(...)的写法,不要用when(实例.方法名(...)).thenCallRealMethod()——后者会先执行一次目标方法,且可能导致真实逻辑未被正确触发。排查是否有冲突的Mock配置
检查测试类中是否存在其他针对authValidationHelper的Mock设置(比如doNothing()),这些配置会覆盖doCallRealMethod()的规则,导致真实逻辑不执行。若使用Spring测试上下文,替换为
@SpyBean
如果测试类用了@SpringBootTest这类Spring注解,单纯的@Spy无法替换Spring容器中的Bean,此时改用@SpyBean注解,它会把Spy实例替换到容器中,确保被测试类能拿到这个Spy对象。
内容的提问来源于stack exchange,提问作者Loren
相关产品推荐
相关产品推荐

