未使用springboot容器管理的类的单元测试-mock

未使用springboot容器管理的类的单测

工作中在开发一个需求时,项目总是跑不起来,具体报错信息忘了,大概就是没有bean,仔细看才发现其中一个类没有使用springboot进行管理,正常的Service层中的代码,在代码的开头都会使用注解@Service进行管理,而这个类中没有,导致项目在运行时出现问题,开始的解决方法是使用new创建对象,但造成的问题是在写单元测试时,无法对new的对象进行mock,导致无法mock此类中的方法。

1.原有类和方法

该类没有使用springboot进行管理

public class SendAO {
	public boolean send(String A, String B, String C) {
		...//业务代码
		return result;
	}
}

2.需求

新需求很简单,就是写一个接口调用原有的send方法

2.1我写的原有代码

@Service
public class SendServiceImpl {

	public sendFun(String A, String B, String C) {
		//业务代码
		SendAO sendAO = new SendAO();
		boolean result = sendAO.send(A, B, C);
		...
	}
}

3.问题

这样的代码在写单元测试的时候,没有办法mock SendAO类,比如我想写

when(sendAO.send(any())).thenReturn(true);

这样的一个单元测试的是没办法实现的,因为类SendAO是new出来的,不是放在springboot中管理bean的。

4.问题解决方法

可以用如下方法实现,首先类SendServiceImpl实现接口InitializingBean,然后初始化类SendAO,最后增加set方法。

4.1更改后代码

@Service
public class SendServiceImpl implements InitializingBean{
	private SendAO sendAO;

	//spring framework中的一个初始化方法
	@Override
    public void afterPropertiesSet() throws Exception {
    	//初始化
        sendAO = new SendAO();
    }

	//set方法
    public void setSendAO(SendAO aSendAO) {
        sendAO = aSendAO;
    }

	public sendFun(String A, String B, String C) {
		//业务代码
		boolean result = sendAO.send(A, B, C);
		...
	}
}

针对这种方法,在写单元测试时,就可以进行mock了,具体的单测代码就不写了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值