diff --git a/src/test/java/com/example/g8backend/service/TorrentServiceTest.java b/src/test/java/com/example/g8backend/service/TorrentServiceTest.java
index 5063501..6ddca58 100644
--- a/src/test/java/com/example/g8backend/service/TorrentServiceTest.java
+++ b/src/test/java/com/example/g8backend/service/TorrentServiceTest.java
@@ -4,6 +4,7 @@
 import com.example.g8backend.entity.Torrent;
 import com.example.g8backend.mapper.TorrentMapper;
 import com.example.g8backend.service.impl.TorrentServiceImpl;
+
 import com.example.g8backend.util.TorrentUtil;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
diff --git a/src/test/java/com/example/g8backend/service/UserServiceImplTest.java b/src/test/java/com/example/g8backend/service/UserServiceImplTest.java
new file mode 100644
index 0000000..96cf868
--- /dev/null
+++ b/src/test/java/com/example/g8backend/service/UserServiceImplTest.java
@@ -0,0 +1,149 @@
+package com.example.g8backend.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.example.g8backend.entity.Follow;
+import com.example.g8backend.entity.Message;
+import com.example.g8backend.entity.User;
+import com.example.g8backend.mapper.FollowMapper;
+import com.example.g8backend.mapper.MessageMapper;
+import com.example.g8backend.mapper.UserMapper;
+import com.example.g8backend.service.impl.UserServiceImpl;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.test.util.ReflectionTestUtils;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.Mockito.*;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+
+@ExtendWith(MockitoExtension.class)
+public class UserServiceImplTest {
+
+    @Mock
+    private UserMapper userMapper;
+
+    @Mock
+    private FollowMapper followMapper;
+
+    @Mock
+    private MessageMapper messageMapper;
+
+    @InjectMocks
+    private UserServiceImpl userService;
+
+    private User user1;
+    private User user2;
+    private Follow follow;
+    private Message message;
+
+    @BeforeEach
+    void setUp() {
+        user1 = new User().setUserId(1L).setUserName("user1");
+        user2 = new User().setUserId(2L).setUserName("user2");
+        ReflectionTestUtils.setField(userService, "baseMapper", userMapper);
+
+        follow = new Follow().setFollowerId(1L).setFollowedId(2L);
+        message = new Message()
+                .setMessageId(100L)
+                .setSenderId(1L)
+                .setReceiverId(2L)
+                .setContent("Hello")
+                .setIsRead(false)
+                .setSentAt(LocalDateTime.now());
+    }
+
+    // ------------------------- 关注功能测试 -------------------------
+    @Test
+    void followUser_Success() {
+        // 模拟Mapper行为
+        when(followMapper.insert(any(Follow.class))).thenReturn(1);
+
+        // 测试关注
+        boolean result = userService.followUser(1L, 2L);
+        assertTrue(result);
+        verify(followMapper, times(1)).insert(any(Follow.class));
+    }
+
+    @Test
+    void followUser_SelfFollow_Fail() {
+        // 尝试关注自己
+        boolean result = userService.followUser(1L, 1L);
+        assertFalse(result);
+        verify(followMapper, never()).insert((Follow) any());
+    }
+
+    @Test
+    void unfollowUser_Success() {
+        // 模拟Mapper行为
+        when(followMapper.deleteByPair(1L, 2L)).thenReturn(1);
+
+        // 测试取消关注
+        boolean result = userService.unfollowUser(1L, 2L);
+        assertTrue(result);
+        verify(followMapper, times(1)).deleteByPair(1L, 2L);
+    }
+
+
+    @Test
+    void getFollowers_EmptyList() {
+        // 模拟无粉丝
+        when(followMapper.selectFollowers(1L)).thenReturn(Collections.emptyList());
+
+        // 测试获取粉丝列表
+        List<User> followers = userService.getFollowers(1L);
+        assertTrue(followers.isEmpty());
+    }
+
+    // ------------------------- 私信功能测试 -------------------------
+    @Test
+    void sendMessage_Success() {
+        // 模拟用户存在
+        when(userMapper.selectById(2L)).thenReturn(user2);
+        when(messageMapper.insert(any(Message.class))).thenAnswer(invocation -> {
+            Message msg = invocation.getArgument(0);
+            msg.setMessageId(100L);
+            return 1;
+        });
+
+        // 测试发送消息
+        Long messageId = userService.sendMessage(1L, 2L, "Hello");
+        assertNotNull(messageId);
+        verify(messageMapper, times(1)).insert(any(Message.class));
+    }
+
+    @Test
+    void sendMessage_ReceiverNotExist_ThrowException() {
+        // 模拟用户不存在
+        when(userMapper.selectById(99L)).thenReturn(null);
+
+        // 测试异常
+        assertThrows(RuntimeException.class, () ->
+                userService.sendMessage(1L, 99L, "Hello")
+        );
+        verify(messageMapper, never()).insert((Message) any());
+    }
+
+    @Test
+    void getMessageHistory_SortedByTime() {
+        // 模拟历史消息
+        Message oldMessage = message.setSentAt(LocalDateTime.now().minusHours(1));
+        when(messageMapper.selectUserMessages(1L))
+                .thenReturn(Arrays.asList(oldMessage, message));
+
+        // 测试按时间倒序排序
+        List<Message> history = userService.getMessageHistory(1L);
+        assertEquals(message.getMessageId(), history.get(0).getMessageId());
+    }
+}
\ No newline at end of file
