You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot使用Mockito和Junit5单元测试时User密码为null如何解决

测试User密码字段为null问题解决步骤
  • 第一步:先确认User实体类本身的赋值逻辑是否正常
    先在setUp方法构造完user1后,直接打印user1.getPassword(),如果此时已经为null,排查以下两个点:
    1. 检查User类全参构造函数的参数顺序是否匹配:你构造时第四个参数传入的是"password1",确认构造函数第四个参数确实对应password字段,没有和其他字段顺序写反
    2. 检查password字段是否存在特殊注解:比如@JsonIgnore、@Column(insertable = false)等会阻止字段赋值的注解,同时确认password字段的setter方法逻辑正常无拼写错误
  • 第二步:修正测试类Mock注解的错误用法
    你对FakeUUIDProvider、BCryptPasswordEncoder使用@InjectMocks注解是错误的:

    @InjectMocks的作用是将声明的@Mock对象注入到被测类的依赖中,被该注解修饰的对象本身是Mockito生成的代理对象,不会执行真实的类逻辑,方法默认返回null。
    如果你需要使用真实的工具类实例,直接手动初始化即可:

    // 替换原有@InjectMocks修饰的代码
    FakeUUIDProvider provider = new FakeUUIDProvider();
    BCryptPasswordEncoder bcrypt = new BCryptPasswordEncoder();
    
    如果你确实需要Mock的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,排查以下两点:
    1. 检查forgotPassword方法逻辑:是否存在重置密码时主动清空旧密码、实体类转换时漏拷密码字段的逻辑
    2. 给Mock的PasswordEncoder打桩:如果你在业务逻辑中调用了passEncoder.encode(),未打桩的Mock对象方法默认返回null,会导致密码被设置为null,添加打桩逻辑即可:
    @BeforeEach
    public void setUp() {
        // 让Mock的密码编码器直接返回传入的明文,方便测试验证
        when(passEncoder.encode(anyString())).thenAnswer(invocation -> invocation.getArgument(0));
    }
    

内容的提问来源于stack exchange,提问作者Boldbayar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:24:04