事情是酱紫的
开发过程中,总会遇到一些不起眼但又很恶心人的问题,比如
- 本地调试,有个方法要获取当前用户(一般都是从token中获取),所以又得去数据库翻一下,找到登陆token,放到postman里面,如果找不到这个用户的token,你还得去拿账号密码去调一下登陆接口
- 某次迭代开发,你依赖的一个Service方法的返回值,需要增加一个字段,但负责开发的同事还没做好,所以你也没办法开始测试,直接改他的代码造假数据吧,又怕冲突,不改吧,自己又不好测
这些问题有个共同点,就是都是小问题,但却让人很难受。
怎么办
@Primary注解
这是spring提供的注解,可以加到类上,spring在进行依赖注入的时候,如果发现这个字段的类型,有多个bean,则优先注入有@Primary的,比如
有一个UserService,写了两个实现类,UserService1和UserService2,其中UserService1上,有@Primary,那么spring自动注入UserService,则会选择UserService1。
gitignore
可以把一些文件或者目录添加到gitignore里面去,这样git就会忽略掉这些内容,idea有插件,用起来很方便
代码演示
准备工作
在自己项目中,建一个叫ignored的package(包的位置,要能够被spring扫描到),并将它加入到gitignore中,这样这个包下面的所有内容,都会被git忽略掉。idea会在颜色上有所区分。
获取当前登录的用户
一般都是一个工具类来实现的,但这种方式明显对本地调试不太友好
public class UserUtil {
public static Integer getCurrentUserId(){
//解析token,然后获取用户id
return 1;
}
}
所以可以写一个接口CurrentUserService
public interface CurrentUserService{
Integer currentUserId();
}
然后写个正常的实现类
@Service
public class CurrentUserServiceImpl implements CurrentUserService {
@Override
public Integer currentUserId() {
return UserUtil.getCurrentUserId();
}
}
业务代码里获取当前用户就不要用工具类了,直接注入CurrentUserservice
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
private CurrentUserService currentUserService;
@Override
public ProductVo get(Integer id) {
//获取当前登录的用户
Integer currentUserId = currentUserService.currentUserId();
//业务代码略
return null;
}
}
在gitignored包下,再写个实现类,自定义获取用户id的方法(我一般从请求头里获取)
@Service
@Primary
public class LocalCurrentUserService implements CurrentUserService {
@Autowired
private HttpServletRequest request;
@Override
public Integer currentUser() {
return Integer.valueOf(request.getHeader("userId"));
}
}
这样在本地调试的时候,就完全可以很方便的自定义当前用户的id了,也完全不用担心会影响到项目代码
未完成的接口模拟调试数据
有了上面的技巧,这种问题也是一样的思路,比如你需要一个ProductService,但是负责开发的人,还没写完,你就可以自己在gitignored里面加一个实现类打上@Primary注解,按照你的需求,自己写一些假数据进来
接口需要强制登录
有的接口需要强制登录才能访问,但是否登录这个是全局设置,不影响功能测试,如果是使用的SpringSecurity
Step1,在开发环境的配置中,加上这么一句,这样所有OnlyTest为前缀的请求,都不用经过登录校验,但要做好注释,避免有人不知情同步到其他环境中
Step2,在gitignored包中,给你需要测试的controller,写一个子类,类上的注解全部复制过来(方法字段都不用复制),并在@RequestMapping前面加一个OnlyTest
要测试的controller
gitignored包下的子类
这么一来,就能绕开登录校验,也不用担心会改错项目代码
结尾
本文就是介绍一些我在项目中用的的“骚操作”,在提升开发体验的同时,也能学习一些框架上的技巧