Spring Boot使用Mockito和Junit5单元测试时User密码为null如何解决
测试User密码字段为null问题解决步骤
- 第一步:先确认User实体类本身的赋值逻辑是否正常
先在setUp方法构造完user1后,直接打印user1.getPassword(),如果此时已经为null,排查以下两个点:- 检查User类全参构造函数的参数顺序是否匹配:你构造时第四个参数传入的是
"password1",确认构造函数第四个参数确实对应password字段,没有和其他字段顺序写反 - 检查
password字段是否存在特殊注解:比如@JsonIgnore、@Column(insertable = false)等会阻止字段赋值的注解,同时确认password字段的setter方法逻辑正常无拼写错误
- 检查User类全参构造函数的参数顺序是否匹配:你构造时第四个参数传入的是
- 第二步:修正测试类Mock注解的错误用法
你对FakeUUIDProvider、BCryptPasswordEncoder使用@InjectMocks注解是错误的:@InjectMocks的作用是将声明的@Mock对象注入到被测类的依赖中,被该注解修饰的对象本身是Mockito生成的代理对象,不会执行真实的类逻辑,方法默认返回null。
如果你需要使用真实的工具类实例,直接手动初始化即可:
如果你确实需要Mock的// 替换原有@InjectMocks修饰的代码 FakeUUIDProvider provider = new FakeUUIDProvider(); BCryptPasswordEncoder bcrypt = new BCryptPasswordEncoder();FakeUUIDProvider,需要给方法提前打桩:@BeforeEach public void setUp() { // 给mock的uuid方法设置返回值,否则默认返回null when(provider.uuid()).thenReturn(UUID.randomUUID().toString()); this.user1 = new User( this.provider.uuid(), "username1", "email1", "password1", "displayName1", true ); } - 第三步:排查
forgotPassword业务逻辑
如果构造user1时密码正常,调用方法后返回的retrivedUser密码为null,排查以下两点:- 检查
forgotPassword方法逻辑:是否存在重置密码时主动清空旧密码、实体类转换时漏拷密码字段的逻辑 - 给Mock的
PasswordEncoder打桩:如果你在业务逻辑中调用了passEncoder.encode(),未打桩的Mock对象方法默认返回null,会导致密码被设置为null,添加打桩逻辑即可:
@BeforeEach public void setUp() { // 让Mock的密码编码器直接返回传入的明文,方便测试验证 when(passEncoder.encode(anyString())).thenAnswer(invocation -> invocation.getArgument(0)); } - 检查
内容的提问来源于stack exchange,提问作者Boldbayar
相关产品推荐
相关产品推荐

