package com.tourguide.modules.user.service; import com.tourguide.common.exception.BusinessException; import com.tourguide.modules.user.dto.AdminPasswordResetRequest; import com.tourguide.modules.user.entity.AdminUser; import com.tourguide.modules.user.mapper.AdminUserMapper; import com.tourguide.modules.user.mapper.SysRoleMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.security.crypto.password.PasswordEncoder; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; class AdminUserServiceTest { private AdminUserMapper userMapper; private PasswordEncoder passwordEncoder; private AdminUserService service; @BeforeEach void setUp() { userMapper = mock(AdminUserMapper.class); passwordEncoder = mock(PasswordEncoder.class); service = new AdminUserService(userMapper, mock(SysRoleMapper.class), passwordEncoder); } @Test void resetPasswordShouldRejectCurrentPassword() { AdminUser user = new AdminUser(); user.setId(8L); user.setPassword("encoded-current-password"); AdminPasswordResetRequest request = new AdminPasswordResetRequest(); request.setNewPassword("NewPassword123!"); request.setConfirmPassword("NewPassword123!"); when(userMapper.selectById(8L)).thenReturn(user); when(passwordEncoder.matches(request.getNewPassword(), user.getPassword())).thenReturn(true); assertThatThrownBy(() -> service.resetPassword(8L, request)) .isInstanceOf(BusinessException.class) .hasMessage("新密码不能和旧密码一致") .extracting(error -> ((BusinessException) error).getCode()) .isEqualTo(400); verify(passwordEncoder, never()).encode(request.getNewPassword()); verify(userMapper, never()).updateById(user); } }