未使用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了,具体的单测代码就不写了。