Mockito mock SpringBean不成功的情况

问题
在做单元测试引入Mockito的过程中,测试发送验证码接口,想使用mock的方式模拟调用短信服务发送验证码。测试类AppService依赖ConfigInfoSynchroHelper,
ConfigInfoSynchroHelper是调用短信的功能实现,AppService的UML图:
这里写图片描述

      测试的过程中,发现如下使用

      @Mock
      private ConfigInfoSynchroHelper configInfoSynchroHelper;

      @Autowired
      @InjectMocks
      private AppService appService;

        测试appService发送验证码接口,都会调用configInfoSynchroHelper的实体实现方法,而不是mock;

        经过调试,发现在AppService引入了类似@ShannonAuditLog(type = AuditType.APP_ADD)自定义注解,使用了AOP

        在实例化AppService Bean的过程中,Spring做了一层封装,导致mock的configInfoSynchroHelper注入不成功。

解决方案
1. 在测试过程中,获取实例化AppServer去除Spring这层封装,在单元测试mock初始化之前执行以下代码:

appService = (AppService) unwrapProxy(appService);
public final Object unwrapProxy(Object bean) throws Exception {
/*
* If the given object is a proxy, set the return value as the object
* being proxied, otherwise return the given object.
*/
if (AopUtils.isAopProxy(bean) && bean instanceof Advised) {
Advised advised = (Advised) bean;
bean = advised.getTargetSource().getTarget();
}
return bean;
}
2. 使用@Bean的方式实例configInfoSynchroHelper

@Bean(name = “configInfoSynchroHelper”)
public ConfigInfoSynchroHelper getConfigInfoSynchroHelper() {
return configInfoSynchroHelper;
}
或者:

@Bean
public ConfigInfoSynchroHelper configInfoSynchroHelper() {
return configInfoSynchroHelper;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值