背景
今天写单测的时候,想进行代码覆盖,有一个条件分支基于启动的属性,如下:
@Value("${isPublic:false}")
private Boolean isPublic;
.....
if (isPublic){
// 发送mq
} else {
// 发送事件
}
isPublic 在springboot 容器启动加载的时候已经赋值,想走到另一个分支,只能通过反射去改变这个属性值
注意点
springboot 通过ApplicationContext 上下文获取到的对象,一般都是spring 代理的对象,直接反射是改变不了属性值的,必须通过
AopUtils.getTargetObject
方法获取原始对象
具体操作
- 引用 具体 类
@Autowired
private PublicFiledService publicFiledService;
- 获取到原始对象,并通过反射改变值
PublicFiledService targetObject = AopUtils.getTargetObject(publicFiledService);
try {
Field field = PublicFiledService.class.getDeclaredField("isPublic");
field.setAccessible(true);
ReflectionUtils.setField(field, targetObject, true);
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
AopUtils 在 org.springframework.aop.support 包下; ReflectionUtils 在 org.springframework.util 包下;