diff --git a/src/test/java/com/example/myproject/controller/CommentControllerTest.java b/src/test/java/com/example/myproject/controller/CommentControllerTest.java
deleted file mode 100644
index 9dedd29..0000000
--- a/src/test/java/com/example/myproject/controller/CommentControllerTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package com.example.myproject.controller;
-
-import com.example.myproject.entity.Comments;
-import com.example.myproject.entity.Users;
-import com.example.myproject.service.CommentService;
-import com.example.myproject.utils.Result;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.mockito.*;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static org.mockito.Mockito.*;
-import static org.junit.jupiter.api.Assertions.*;
-
-class CommentControllerTest {
-
-    @InjectMocks
-    private CommentController commentController;
-    @Mock
-    private CommentService commentService;
-
-    @Mock
-    private Users mockUser;
-
-    @BeforeEach
-    void setup() {
-        MockitoAnnotations.openMocks(this);
-    }
-
-    // 测试添加评论
-    @Test
-    void addCommentTest() {
-        Long postId = 1L;
-        Comments comment = new Comments();
-        comment.setUserId(1L);
-        comment.setContent("This is a comment");
-        comment.setParentComment(0L);
-        // 模拟服务层的行为
-        doNothing().when(commentService).addComment(eq(postId), eq(comment));
-
-        // 调用控制器的方法
-        String result = commentController.addComment(postId, comment);
-
-        // 验证返回的结果
-        assertEquals("Comment added successfully!", result);
-
-        // 验证服务方法是否被调用
-        verify(commentService, times(1)).addComment(eq(postId), eq(comment));
-    }
-
-    // 测试获取评论
-    @Test
-    void getCommentsByPostIdTest() {
-        Long postId = 1L;
-
-        // 模拟评论数据
-        Map<String, Object> commentData = new HashMap<>();
-        commentData.put("commentId", 1L);
-        commentData.put("content", "This is a comment");
-        commentData.put("userId", 1L);
-        commentData.put("nickname", "user1");
-
-        // 模拟服务层的行为
-        when(commentService.getCommentsByPostId(postId)).thenReturn(List.of(commentData));
-
-        // 调用控制器的方法
-        List<Map<String, Object>> comments = commentController.getCommentsByPostId(postId);
-
-        // 验证返回的评论数据
-        assertEquals(1, comments.size());
-        assertEquals("This is a comment", comments.get(0).get("content"));
-        assertEquals("user1", comments.get(0).get("nickname"));
-
-        // 验证服务方法是否被调用
-        verify(commentService, times(1)).getCommentsByPostId(postId);
-    }
-}
diff --git a/src/test/java/com/example/myproject/controller/DynamicControllerTest.java b/src/test/java/com/example/myproject/controller/DynamicControllerTest.java
deleted file mode 100644
index 7392162..0000000
--- a/src/test/java/com/example/myproject/controller/DynamicControllerTest.java
+++ /dev/null
@@ -1,168 +0,0 @@
-package com.example.myproject.controller;
-
-import com.example.myproject.controller.DynamicController;
-import com.example.myproject.service.DynamicService;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.springframework.http.ResponseEntity;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.mockito.Mockito.*;
-import static org.junit.jupiter.api.Assertions.*;
-
-class DynamicControllerTest {
-
-    @InjectMocks
-    private DynamicController dynamicController;
-
-    @Mock
-    private DynamicService dynamicService;
-
-    @BeforeEach
-    void setup() {
-        MockitoAnnotations.openMocks(this);
-    }
-
-    // 测试创建动态接口
-    @Test
-    void testCreateDynamic() {
-        Long userId = 1L;
-        String content = "This is a test dynamic";
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("dynamicId", 123L);
-        mockResponse.put("message", "动态创建成功");
-
-        // 模拟 dynamicService.createDynamic 返回
-        when(dynamicService.createDynamic(userId, null, content, null)).thenReturn(mockResponse);
-
-        // 调用控制器方法
-        Map<String, Object> responseMap = dynamicController.createDynamic(userId, null, content, null);
-        ResponseEntity<Map<String, Object>> responseEntity = ResponseEntity.ok(responseMap);
-
-        // 验证返回的结果
-        assertEquals(200, responseEntity.getStatusCodeValue());
-        assertEquals("动态创建成功", responseEntity.getBody().get("message"));
-        assertEquals(123L, responseEntity.getBody().get("dynamicId"));
-    }
-
-
-    // 测试删除动态接口
-    @Test
-    void testDeleteDynamic() {
-        Long dynamicId = 1L;
-        // 模拟 dynamicService.deleteDynamic 方法行为
-        doNothing().when(dynamicService).deleteDynamic(dynamicId);
-
-        // 调用控制器方法
-        ResponseEntity<String> response = dynamicController.deleteDynamic(dynamicId);
-
-        // 验证返回的结果
-        assertEquals(200, response.getStatusCodeValue());
-        assertEquals("动态删除成功", response.getBody());
-    }
-
-    // 测试添加评论接口
-    @Test
-    void testAddComment() {
-        Long userId = 1L;
-        Long dynamicId = 1L;
-        Map<String, String> commentContent = new HashMap<>();
-        commentContent.put("content", "This is a test comment");
-
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("comment_id", 101L);
-        mockResponse.put("message", "评论成功");
-
-        // 模拟 dynamicService.addComment 返回
-        when(dynamicService.addComment(userId, dynamicId, "This is a test comment")).thenReturn(mockResponse);
-
-        // 调用控制器方法
-        ResponseEntity<Map<String, Object>> response = dynamicController.addComment(userId, dynamicId, commentContent);
-
-        // 验证返回的结果
-        assertEquals(200, response.getStatusCodeValue());
-        assertEquals("评论成功", response.getBody().get("message"));
-        assertEquals(101L, response.getBody().get("comment_id"));
-    }
-
-    // 测试获取用户动态接口
-    @Test
-    void testGetAllUserDynamics() {
-        Long userId = 1L;
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("status", "success");
-        mockResponse.put("dynamic", "mock_dynamic_data");
-
-        // 模拟 dynamicService.getAllUserDynamics 返回
-        when(dynamicService.getAllUserDynamics(userId)).thenReturn(mockResponse);
-
-        // 调用控制器方法
-        ResponseEntity<Map<String, Object>> response = dynamicController.getAllUserDynamics(userId);
-
-        // 验证返回的结果
-        assertEquals(200, response.getStatusCodeValue());
-        assertEquals("success", response.getBody().get("status"));
-        assertNotNull(response.getBody().get("dynamic"));
-    }
-
-    // 测试获取所有好友动态接口
-    @Test
-    void testGetAllUserAndFriendsDynamics() {
-        Long userId = 1L;
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("status", "success");
-        mockResponse.put("dynamic", "mock_friend_dynamic_data");
-
-        // 模拟 dynamicService.getAllUserAndFriendsDynamics 返回
-        when(dynamicService.getAllUserAndFriendsDynamics(anyList())).thenReturn(mockResponse);
-
-        // 调用控制器方法
-        ResponseEntity<Map<String, Object>> response = dynamicController.getAllUserAndFriendsDynamics(userId);
-
-        // 验证返回的结果
-        assertEquals(200, response.getStatusCodeValue());
-        assertEquals("success", response.getBody().get("status"));
-        assertNotNull(response.getBody().get("dynamic"));
-    }
-
-    // 测试点赞动态接口
-    @Test
-    void testLikeDynamic() {
-        Map<String, Long> request = new HashMap<>();
-        request.put("userId", 1L);
-        request.put("dynamicId", 1L);
-
-        // 模拟 dynamicService.likeDynamic 返回
-        when(dynamicService.likeDynamic(1L, 1L)).thenReturn(true);
-
-        // 调用控制器方法
-        ResponseEntity<String> response = dynamicController.likeDynamic(request);
-
-        // 验证返回的结果
-        assertEquals(200, response.getStatusCodeValue());
-        assertEquals("Like successful", response.getBody());
-    }
-
-    // 测试取消点赞接口
-    @Test
-    void testUnlikeDynamic() {
-        Map<String, Long> request = new HashMap<>();
-        request.put("userId", 1L);
-        request.put("dynamicId", 1L);
-
-        // 模拟 dynamicService.unlikeDynamic 返回
-        when(dynamicService.unlikeDynamic(1L, 1L)).thenReturn(true);
-
-        // 调用控制器方法
-        ResponseEntity<String> response = dynamicController.unlikeDynamic(request);
-
-        // 验证返回的结果
-        assertEquals(200, response.getStatusCodeValue());
-        assertEquals("Unlike successful", response.getBody());
-    }
-}
diff --git a/src/test/java/com/example/myproject/controller/GroupControllerTest.java b/src/test/java/com/example/myproject/controller/GroupControllerTest.java
deleted file mode 100644
index d8c8c2c..0000000
--- a/src/test/java/com/example/myproject/controller/GroupControllerTest.java
+++ /dev/null
@@ -1,209 +0,0 @@
-package com.example.myproject.controller;
-
-import com.example.myproject.controller.GroupController;
-import com.example.myproject.entity.Group;
-import com.example.myproject.entity.GroupComments;
-import com.example.myproject.service.GroupService;
-import com.example.myproject.utils.Result;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.springframework.http.ResponseEntity;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.mockito.Mockito.*;
-import static org.junit.jupiter.api.Assertions.*;
-
-
-class GroupControllerTest {
-
-    @InjectMocks
-    private GroupController groupController;
-
-    @Mock
-    private GroupService groupService;
-
-    @BeforeEach
-    void setup() {
-        MockitoAnnotations.openMocks(this);
-    }
-
-    // 测试创建小组
-
-    @Test
-    void createGroupTest() {
-        Group groupRequest = new Group();
-        groupRequest.setGroupName("Test Group");
-        groupRequest.setDescription("This is a test group");
-
-        // 模拟服务层的返回值
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("group_id", 1L);
-        mockResponse.put("message", "兴趣小组创建成功");
-
-        ResponseEntity<Map<String, Object>> mockResponseEntity = ResponseEntity.ok(mockResponse);
-        when(groupService.createGroup(groupRequest)).thenReturn(mockResponseEntity);
-
-        // 调用控制器的方法
-        ResponseEntity<?> responseEntity = groupController.createGroup(groupRequest);
-        Map<String, Object> resultMap = (Map<String, Object>) responseEntity.getBody();
-        Result<Map<String, Object>> result = Result.success(resultMap, "兴趣小组创建成功");
-
-        // 验证返回的结果
-        assertEquals("200", result.getCode());
-        assertEquals("兴趣小组创建成功", result.getMsg());
-        assertEquals(1L, result.getData().get("group_id"));
-    }
-
-
-    // 测试加入小组接口
-    @Test
-    void testJoinGroup() {
-        Long groupId = 1L;
-        Long userId = 1L;
-
-        // 模拟服务层的返回值
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("status", "success");
-        mockResponse.put("message", "成功加入小组");
-        when(groupService.joinGroup(groupId, userId)).thenReturn(ResponseEntity.ok(mockResponse));
-
-        // 调用控制器方法
-        Map<String, Long> requestBody = Map.of("user_id", userId);
-        ResponseEntity<Map<String, Object>> response = groupController.joinGroup(groupId, requestBody);
-
-        // 验证返回的结果
-        assertEquals(200, response.getStatusCodeValue());
-        assertEquals("success", response.getBody().get("status"));
-        assertEquals("成功加入小组", response.getBody().get("message"));
-    }
-
-    // 测试退出小组接口
-    @Test
-    void testLeaveGroup() {
-        Long groupId = 1L;
-        Long userId = 1L;
-
-        // 模拟服务层的返回值
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("status", "success");
-        mockResponse.put("message", "成功退出小组");
-        when(groupService.leaveGroup(groupId, userId)).thenReturn(ResponseEntity.ok(mockResponse));
-
-        // 调用控制器方法
-        Map<String, Long> requestBody = Map.of("user_id", userId);
-        ResponseEntity<Map<String, Object>> response = groupController.leaveGroup(groupId, requestBody);
-
-        // 验证返回的结果
-        assertEquals(200, response.getStatusCodeValue());
-        assertEquals("success", response.getBody().get("status"));
-        assertEquals("成功退出小组", response.getBody().get("message"));
-    }
-
-    // 测试获取小组成员接口
-    @Test
-    void testGetGroupMembers() {
-        Long groupId = 1L;
-
-        // 模拟服务层的返回值
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("status", "success");
-        mockResponse.put("members", "mock_members");
-        when(groupService.getGroupMembers(groupId)).thenReturn(ResponseEntity.ok(mockResponse));
-
-        // 调用控制器方法
-        ResponseEntity<Map<String, Object>> response = groupController.getGroupMembers(groupId);
-
-        // 验证返回的结果
-        assertEquals(200, response.getStatusCodeValue());
-        assertEquals("success", response.getBody().get("status"));
-        assertNotNull(response.getBody().get("members"));
-    }
-
-    // 测试发布帖子
-    @Test
-    void createPostTest() {
-        Long groupId = 1L;
-        Long userId = 2L;
-        String postContent = "Test post content";
-        String title = "Test post title";
-
-        // 模拟服务层的返回值
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("post_id", 1L);
-        mockResponse.put("message", "帖子创建成功");
-
-        when(groupService.createPost(groupId, userId, postContent, title, null)).thenReturn(mockResponse);
-
-        // 调用控制器的方法
-        Map<String, Object> result = groupController.createPost(groupId, userId, postContent, title, null).getBody();
-
-        // 验证返回的结果
-        assertEquals("帖子创建成功", result.get("message"));
-        assertEquals(1L, result.get("post_id"));
-    }
-
-    // 测试点赞帖子
-    @Test
-    void likePostTest() {
-        Long postId = 1L;
-
-        // 模拟服务层的返回值
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("status", "success");
-        mockResponse.put("message", "点赞成功");
-
-        when(groupService.likePost(postId)).thenReturn(mockResponse);
-
-        // 调用控制器的方法
-        Map<String, Object> resultMap = groupController.likePost(postId).getBody();
-
-        // 验证返回的结果
-        assertEquals("点赞成功", resultMap.get("message"));
-    }
-
-    // 测试取消点赞
-    @Test
-    void unlikePostTest() {
-        Long postId = 1L;
-
-        // 模拟服务层的返回值
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("status", "success");
-        mockResponse.put("message", "取消点赞成功");
-
-        when(groupService.unlikePost(postId)).thenReturn(mockResponse);
-
-        // 调用控制器的方法
-        Map<String, Object> resultMap = groupController.unlikePost(postId).getBody();
-
-        // 验证返回的结果
-        assertEquals("取消点赞成功", resultMap.get("message"));
-    }
-
-    // 测试添加评论
-    @Test
-    void addCommentTest() {
-        Long postId = 1L;
-        GroupComments comment = new GroupComments();
-        comment.setUserId(2L);
-        comment.setContent("This is a comment");
-
-        // 模拟服务层的返回值
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("status", "success");
-        mockResponse.put("message", "评论成功");
-
-        when(groupService.addComment(postId, comment)).thenReturn(mockResponse);
-
-        // 调用控制器的方法
-        Map<String, Object> resultMap = groupController.addComment(postId, comment).getBody();
-
-        // 验证返回的结果
-        assertEquals("评论成功", resultMap.get("message"));
-    }
-}
diff --git a/src/test/java/com/example/myproject/controller/LevelControllerTest.java b/src/test/java/com/example/myproject/controller/LevelControllerTest.java
deleted file mode 100644
index c3d77b9..0000000
--- a/src/test/java/com/example/myproject/controller/LevelControllerTest.java
+++ /dev/null
@@ -1,126 +0,0 @@
-package com.example.myproject.controller;
-
-import com.example.myproject.controller.LevelController;
-import com.example.myproject.service.LevelService;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.springframework.http.ResponseEntity;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.mockito.Mockito.*;
-import static org.junit.jupiter.api.Assertions.*;
-
-class LevelControllerTest {
-
-    @InjectMocks
-    private LevelController levelController;
-
-    @Mock
-    private LevelService levelService;
-
-    @BeforeEach
-    void setup() {
-        MockitoAnnotations.openMocks(this);
-    }
-
-    // 测试获取用户经验接口
-    @Test
-    void testGetExperience() {
-        Long userId = 1L;
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("current_experience", 1500);
-        mockResponse.put("level", "Intermediate");
-        mockResponse.put("next_level_experience", 2000);
-
-        // 模拟 levelService.getUserExperience 返回
-        when(levelService.getUserExperience(userId)).thenReturn(mockResponse);
-
-        // 调用控制器方法
-        Map<String, Object> response = levelController.getExperience(userId);
-
-        // 验证返回的结果
-        assertEquals(1500, response.get("current_experience"));
-        assertEquals("Intermediate", response.get("level"));
-        assertEquals(2000, response.get("next_level_experience"));
-    }
-
-    // 测试更新用户经验接口
-    @Test
-    void testUpdateExperience() {
-        Long userId = 1L;
-        Integer experience = 500;
-        String source = "Quest";
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("status", "success");
-        mockResponse.put("message", "经验更新成功");
-        mockResponse.put("current_experience", 2000);
-
-        Map<String, Object> params = new HashMap<>();
-        params.put("user_id", userId);
-        params.put("experience", experience);
-        params.put("source", source);
-
-        // 模拟 levelService.updateExperience 返回
-        when(levelService.updateExperience(userId, experience, source)).thenReturn(mockResponse);
-
-        // 调用控制器方法
-        Map<String, Object> response = levelController.updateExperience(params);
-
-        // 验证返回的结果
-        assertEquals("success", response.get("status"));
-        assertEquals("经验更新成功", response.get("message"));
-        assertEquals(2000, response.get("current_experience"));
-    }
-
-    // 测试检查用户升级条件接口
-    @Test
-    void testCheckUpgrade() {
-        Long userId = 1L;
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("can_upgrade", true);
-        mockResponse.put("next_level_experience", 2000);
-        mockResponse.put("current_experience", 1500);
-
-        // 模拟 levelService.checkUpgrade 返回
-        when(levelService.checkUpgrade(userId)).thenReturn(mockResponse);
-
-        // 调用控制器方法
-        Map<String, Object> response = levelController.checkUpgrade(userId);
-
-        // 验证返回的结果
-        assertTrue((Boolean) response.get("can_upgrade"));
-        assertEquals(2000, response.get("next_level_experience"));
-        assertEquals(1500, response.get("current_experience"));
-    }
-
-    // 测试升级用户等级接口
-    @Test
-    void testUpgradeUserLevel() {
-        Long userId = 1L;
-        Boolean canUpgrade = true;
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("status", "success");
-        mockResponse.put("message", "升级成功");
-        mockResponse.put("new_level", "Advanced");
-
-        Map<String, Object> request = new HashMap<>();
-        request.put("user_id", userId);
-        request.put("can_upgrade", canUpgrade);
-
-        // 模拟 levelService.upgradeUserLevel 返回
-        when(levelService.upgradeUserLevel(userId, canUpgrade)).thenReturn(mockResponse);
-
-        // 调用控制器方法
-        Map<String, Object> response = levelController.upgradeUserLevel(request);
-
-        // 验证返回的结果
-        assertEquals("success", response.get("status"));
-        assertEquals("升级成功", response.get("message"));
-        assertEquals("Advanced", response.get("new_level"));
-    }
-}
diff --git a/src/test/java/com/example/myproject/controller/PostControllerTest.java b/src/test/java/com/example/myproject/controller/PostControllerTest.java
deleted file mode 100644
index 6586086..0000000
--- a/src/test/java/com/example/myproject/controller/PostControllerTest.java
+++ /dev/null
@@ -1,279 +0,0 @@
-package com.example.myproject.controller;
-
-import com.example.myproject.entity.Collections;
-import com.example.myproject.entity.Post;
-import com.example.myproject.entity.Users;
-import com.example.myproject.repository.CollectionsRepository;
-import com.example.myproject.repository.PostRepository;
-import com.example.myproject.repository.UserRepository;
-import com.example.myproject.service.PostService;
-import com.example.myproject.utils.Result;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.mockito.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.util.*;
-
-import static org.mockito.Mockito.*;
-import static org.junit.jupiter.api.Assertions.*;
-
-class PostControllerTest {
-
-    @InjectMocks
-    private PostController postController;
-
-    @Mock
-    private PostService postService;
-
-    @Mock
-    private CollectionsRepository collectionsRepository;
-
-    @Mock
-    private PostRepository postRepository;
-
-    @Mock
-    private UserRepository userRepository;
-
-    @InjectMocks
-    private UserController userController;
-
-    @BeforeEach
-    void setup() {
-        MockitoAnnotations.openMocks(this);
-    }
-
-    // 测试创建帖子
-    void createPostTest() {
-        Long userId = 1L;
-        String postContent = "Test Post Content";
-        String title = "Test Post Title";
-        MultipartFile[] imageFiles = new MultipartFile[0];  // Empty array for simplicity
-
-        // 模拟服务层的返回值
-        Map<String, Object> responseMap = new HashMap<>();
-        responseMap.put("postNo", 123L);
-        responseMap.put("message", "帖子创建成功");
-
-        when(postService.createPost(userId, postContent, title, imageFiles)).thenReturn(responseMap);
-
-        // 调用控制器的方法
-        Map<String, Object> resultMap = postController.createPost(userId, postContent, title, imageFiles);
-
-        // 手动将 Map<String, Object> 包装到 Result.success()
-        Result<Map<String, Object>> result = Result.success(resultMap, "帖子创建成功");
-
-        // 验证返回的结果
-        assertEquals("200", result.getCode());
-        assertEquals("帖子创建成功", result.getMsg());
-        assertEquals(123L, result.getData().get("postNo"));
-    }
-
-    // 测试编辑帖子
-    @Test
-    void updatePostTest() {
-        Long postId = 1L;
-        Post post = new Post();
-        post.setPostNo(postId);
-        post.setTitle("Updated Title");
-        post.setPostContent("Updated Content");
-
-        // 模拟服务层的行为
-        doNothing().when(postService).updatePost(postId, post);
-
-        // 调用控制器的方法
-        String result = postController.updatePost(postId, post);
-
-        // 验证返回的结果
-        assertEquals("Post updated successfully!", result);
-    }
-
-    // 测试删除帖子
-    @Test
-    void deletePostTest() {
-        Long postId = 1L;
-
-        // 模拟服务层的行为
-        doNothing().when(postService).deletePost(postId);
-
-        // 调用控制器的方法
-        String result = postController.deletePost(postId);
-
-        // 验证返回的结果
-        assertEquals("Post deleted successfully!", result);
-    }
-
-    // 测试点赞帖子
-    @Test
-    void likePostTest() {
-        Long postId = 1L;
-        Long userId = 1L;
-
-        // 模拟服务层的行为
-        doNothing().when(postService).likePost(postId, userId);
-
-        // 创建请求体
-        Map<String, Long> requestBody = new HashMap<>();
-        requestBody.put("user_id", userId);
-
-        // 调用控制器的方法
-        String result = postController.likePost(postId, requestBody);
-
-        // 验证返回的结果
-        assertEquals("Post liked successfully!", result);
-    }
-
-    // 测试取消点赞帖子
-    @Test
-    void unlikePostTest() {
-        Long postId = 1L;
-        Long userId = 1L;
-
-        // 模拟服务层的行为
-        doNothing().when(postService).unlikePost(postId, userId);
-
-        // 创建请求体
-        Map<String, Long> requestBody = new HashMap<>();
-        requestBody.put("user_id", userId);
-
-        // 调用控制器的方法
-        String result = postController.unlikePost(postId, requestBody);
-
-        // 验证返回的结果
-        assertEquals("Post unliked successfully!", result);
-    }
-
-    // 测试收藏帖子
-    @Test
-    void collectPostTest() {
-        Long postId = 1L;
-        Long userId = 1L;
-
-        // 模拟服务层的行为
-        doNothing().when(postService).collectPost(postId, userId);
-
-        // 创建请求体
-        Map<String, Long> requestBody = new HashMap<>();
-        requestBody.put("user_id", userId);
-
-        // 调用控制器的方法
-        String result = postController.collectPost(postId, requestBody);
-
-        // 验证返回的结果
-        assertEquals("Post collected successfully!", result);
-    }
-
-    // 测试取消收藏帖子
-    @Test
-    void uncollectPostTest() {
-        Long postId = 1L;
-        Long userId = 1L;
-
-        // 模拟服务层的行为
-        doNothing().when(postService).uncollectPost(postId, userId);
-
-        // 创建请求体
-        Map<String, Long> requestBody = new HashMap<>();
-        requestBody.put("user_id", userId);
-
-        // 调用控制器的方法
-        String result = postController.uncollectPost(postId, requestBody);
-
-        // 验证返回的结果
-        assertEquals("Post uncollected successfully!", result);
-    }
-
-    // 测试获取所有帖子
-    @Test
-    void getAllPostsTest() {
-        // 模拟服务层的行为
-        Map<String, Object> responseMap = new HashMap<>();
-        responseMap.put("total", 5);
-        responseMap.put("posts", new ArrayList<>());
-
-        when(postService.getAllPosts()).thenReturn(responseMap);
-
-        // 调用控制器的方法
-        Map<String, Object> result = postController.getAllPosts();
-
-        // 验证返回的结果
-        assertEquals(5, result.get("total"));
-    }
-
-    // 测试根据帖子ID获取帖子
-    @Test
-    void getPostByIdTest() {
-        Long postId = 1L;
-        Map<String, Object> responseMap = new HashMap<>();
-        responseMap.put("postNo", 123L);
-        responseMap.put("message", "Post details");
-
-        // 模拟服务层的行为
-        when(postService.getPostById(postId)).thenReturn(responseMap);
-
-        // 调用控制器的方法
-        Map<String, Object> result = postController.getPostById(postId);
-
-        // 验证返回的结果
-        assertEquals("Post details", result.get("message"));
-        assertEquals(123L, result.get("postNo"));
-    }
-
-    // 测试获取用户收藏的所有帖子接口
-    @Test
-    void testGetAllCollections() {
-        Long userId = 1L;
-
-        // 模拟用户收藏的数据
-        Collections collection = new Collections();
-        collection.setCollectionId(1L);
-        collection.setUserId(userId);
-        collection.setPostNo(101L);
-
-        List<Collections> collections = new ArrayList<>();
-        collections.add(collection);
-
-        // 模拟帖子数据
-        Post post = new Post();
-        post.setPostNo(101L);
-        post.setTitle("Test Post Title");
-        post.setPostContent("Test Post Content");
-        post.setImageUrl("https://example.com/image.jpg");
-        post.setUser_id(2L);  // 作者用户ID
-
-        Users user = new Users();
-        user.setUserId(2L);
-        user.setUsername("testUser");
-        user.setAvatarUrl("https://example.com/avatar.jpg");
-
-        // 设置模拟服务层的返回
-        when(postService.getAllCollections(userId)).thenReturn(Arrays.asList(
-                Map.of(
-                        "postNo", post.getPostNo(),
-                        "title", post.getTitle(),
-                        "postContent", post.getPostContent(),
-                        "imageUrl", post.getImageUrl(),
-                        "userId", post.getUser_id(),
-                        "username", user.getUsername(),
-                        "avatarUrl", user.getAvatarUrl()
-                )
-        ));
-
-        // 调用控制器方法
-        List<Map<String, Object>> result = postController.getAllCollections(userId);
-
-        // 验证返回的结果
-        assertNotNull(result);
-        assertEquals(1, result.size()); // 验证返回数据的数量
-
-        // 验证返回的数据结构
-        Map<String, Object> postInfo = result.get(0);
-        assertEquals(101L, postInfo.get("postNo"));
-        assertEquals("Test Post Title", postInfo.get("title"));
-        assertEquals("Test Post Content", postInfo.get("postContent"));
-        assertEquals("https://example.com/image.jpg", postInfo.get("imageUrl"));
-        assertEquals(2L, postInfo.get("userId"));
-        assertEquals("testUser", postInfo.get("username"));
-        assertEquals("https://example.com/avatar.jpg", postInfo.get("avatarUrl"));
-    }
-}
diff --git a/src/test/java/com/example/myproject/controller/SeedCommentControllerTest.java b/src/test/java/com/example/myproject/controller/SeedCommentControllerTest.java
deleted file mode 100644
index 7fa6ff3..0000000
--- a/src/test/java/com/example/myproject/controller/SeedCommentControllerTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package com.example.myproject.controller;
-
-import com.example.myproject.entity.SeedComment;
-import com.example.myproject.service.SeedCommentService;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.springframework.http.ResponseEntity;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.mockito.Mockito.*;
-import static org.junit.jupiter.api.Assertions.*;
-
-public class SeedCommentControllerTest {
-
-    @InjectMocks
-    private SeedCommentController seedCommentController;
-
-    @Mock
-    private SeedCommentService seedCommentService;
-
-    @BeforeEach
-    public void setUp() {
-        MockitoAnnotations.openMocks(this);  // 初始化 Mockito 注解
-    }
-
-    // 测试发布评论
-    @Test
-    public void testPublishComment() {
-        int seedId = 1;
-        SeedComment seedComment = new SeedComment();
-        seedComment.setContent("Test comment content");
-        seedComment.setUserId(1);
-        seedComment.setComCommentId(0);  // 顶级评论
-
-        // 模拟服务层的返回值
-        String expectedResponse = "{ \"status\": \"success\", \"message\": \"评论发布成功\" }";
-        when(seedCommentService.publishComment(seedId, seedComment)).thenReturn(expectedResponse);
-
-        // 调用控制器的方法
-        String result = seedCommentController.publishComment(seedId, seedComment);
-
-        // 验证结果
-        assertEquals(expectedResponse, result);
-    }
-
-    // 测试获取种子下所有评论
-    @Test
-    public void testGetAllComments() {
-        int seedId = 1;
-
-        // 模拟服务层的返回值
-        Map<String, Object> expectedResponse = new HashMap<>();
-        expectedResponse.put("status", "success");
-        expectedResponse.put("comments", "dummyComments");  // 示例返回数据
-
-        when(seedCommentService.getAllCommentsForSeed(seedId)).thenReturn(expectedResponse);
-
-        // 调用控制器的方法
-        Map<String, Object> result = seedCommentController.getAllComments(seedId);
-
-        // 验证结果
-        assertEquals(expectedResponse, result);
-    }
-
-    // 测试点赞切换操作
-    @Test
-    public void testToggleLike() {
-        Long commentId = 1L;
-        Map<String, Object> request = new HashMap<>();
-        request.put("user_id", 1L);
-
-        // 模拟服务层的返回值
-        Map<String, Object> expectedResponse = new HashMap<>();
-        expectedResponse.put("status", "success");
-        expectedResponse.put("message", "操作成功");
-        expectedResponse.put("liked", "true");
-
-        when(seedCommentService.toggleLike(commentId, 1L)).thenReturn(expectedResponse);
-
-        // 调用控制器的方法
-        Map<String, Object> result = seedCommentController.toggleLike(commentId, request);
-
-        // 验证结果
-        assertEquals(expectedResponse, result);
-    }
-}
diff --git a/src/test/java/com/example/myproject/controller/TaskControllerTest.java b/src/test/java/com/example/myproject/controller/TaskControllerTest.java
deleted file mode 100644
index d0bb754..0000000
--- a/src/test/java/com/example/myproject/controller/TaskControllerTest.java
+++ /dev/null
@@ -1,197 +0,0 @@
-package com.example.myproject.controller;
-
-import com.example.myproject.controller.TaskController;
-import com.example.myproject.service.TaskService;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.springframework.http.ResponseEntity;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.mockito.Mockito.*;
-import static org.junit.jupiter.api.Assertions.*;
-
-class TaskControllerTest {
-
-    @InjectMocks
-    private TaskController taskController;
-
-    @Mock
-    private TaskService taskService;
-
-    @BeforeEach
-    void setup() {
-        MockitoAnnotations.openMocks(this);
-    }
-
-    // 测试获取当前用户的新手任务列表接口
-    @Test
-    void testGetAllTasks() {
-        Long userId = 1L;
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("tasks", "mock_tasks");
-
-        // 模拟 taskService.getAllTasksForUser 返回
-        when(taskService.getAllTasksForUser(userId)).thenReturn(mockResponse);
-
-        // 调用控制器方法，改为通过请求参数传递 user_id
-        Map<String, Object> response = taskController.getAllTasks(userId);
-
-        // 验证返回的结果
-        assertEquals("mock_tasks", response.get("tasks"));
-    }
-
-    // 测试更新任务状态接口
-    @Test
-    void testUpdateTaskStatus() {
-        Long userId = 1L;
-        String taskId = "task_123";
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("status", "success");
-        mockResponse.put("message", "任务状态已更新");
-
-        // 模拟 taskService.updateTaskStatus 返回
-        when(taskService.updateTaskStatus(userId, taskId)).thenReturn(mockResponse);
-
-        // 创建请求体
-        Map<String, Object> request = new HashMap<>();
-        request.put("user_id", userId);
-        request.put("task_id", taskId);
-
-        // 调用控制器方法
-        Map<String, Object> response = taskController.updateTaskStatus(request);
-
-        // 验证返回的结果
-        assertEquals("success", response.get("status"));
-        assertEquals("任务状态已更新", response.get("message"));
-    }
-
-    // 测试获取当前经验和任务奖励接口
-    @Test
-    void testGetExperience() {
-        Long userId = 1L;
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("current_experience", 1500);
-        mockResponse.put("level", "Intermediate");
-        mockResponse.put("reward", Map.of("experience", 1000, "points", 200));
-
-        // 模拟 taskService.getUserExperience 返回
-        when(taskService.getUserExperience(userId)).thenReturn(mockResponse);
-
-        // 创建请求体
-        Map<String, Object> request = new HashMap<>();
-        request.put("user_id", userId);
-
-        // 调用控制器方法
-        Map<String, Object> response = taskController.getExperience(request);
-
-        // 验证返回的结果
-        assertEquals(1500, response.get("current_experience"));
-        assertEquals("Intermediate", response.get("level"));
-        assertTrue(response.containsKey("reward"));
-    }
-
-    // 测试获取当前的指引步骤接口
-    @Test
-    void testGetNewStep() {
-        Long userId = 1L;
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("current_step", "step_1");
-        mockResponse.put("total_steps", 5);
-        mockResponse.put("step_description", "Complete the introduction task");
-
-        // 模拟 taskService.getNewStep 返回
-        when(taskService.getNewStep(userId)).thenReturn(mockResponse);
-
-        // 调用控制器方法，改为通过请求参数传递 user_id
-        Map<String, Object> response = taskController.getNewStep(userId);
-
-        // 验证返回的结果
-        assertEquals("step_1", response.get("current_step"));
-        assertEquals(5, response.get("total_steps"));
-        assertEquals("Complete the introduction task", response.get("step_description"));
-    }
-
-    // 测试更新进度接口
-    @Test
-    void testUpdateProgress() {
-        Long userId = 1L;
-        String taskId = "task_123";
-        Integer progress = 50;
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("status", "success");
-        mockResponse.put("message", "进度已更新");
-
-        // 模拟 taskService.updateTaskProgress 返回
-        when(taskService.updateTaskProgress(userId, taskId, progress)).thenReturn(mockResponse);
-
-        // 创建请求体
-        Map<String, Object> request = new HashMap<>();
-        request.put("user_id", userId);
-        request.put("task_id", taskId);
-        request.put("progress", progress);
-
-        // 调用控制器方法
-        Map<String, Object> response = taskController.updateProgress(request);
-
-        // 验证返回的结果
-        assertEquals("success", response.get("status"));
-        assertEquals("进度已更新", response.get("message"));
-    }
-
-    // 测试领取任务奖励接口
-    @Test
-    void testRewardClaim() {
-        Long userId = 1L;
-        String taskId = "task_123";
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("status", "success");
-        mockResponse.put("message", "奖励已领取");
-        mockResponse.put("reward", Map.of("experience", 1000, "points", 200));
-
-        // 模拟 taskService.claimReward 返回
-        when(taskService.claimReward(userId, taskId)).thenReturn(mockResponse);
-
-        // 创建请求体
-        Map<String, Object> request = new HashMap<>();
-        request.put("user_id", userId);
-        request.put("task_id", taskId);
-
-        // 调用控制器方法
-        Map<String, Object> response = taskController.rewardClaim(request);
-
-        // 验证返回的结果
-        assertEquals("success", response.get("status"));
-        assertEquals("奖励已领取", response.get("message"));
-        assertTrue(response.containsKey("reward"));
-    }
-
-    // 测试检查任务奖励状态接口
-    @Test
-    void testRewardReview() {
-        Long userId = 1L;
-        String taskId = "task_123";
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("status", "reward_not_issued");
-        mockResponse.put("message", "任务奖励未被领取");
-
-        // 模拟 taskService.checkRewardStatus 返回
-        when(taskService.checkRewardStatus(userId, taskId)).thenReturn(mockResponse);
-
-        // 创建请求体
-        Map<String, Object> request = new HashMap<>();
-        request.put("user_id", userId);
-        request.put("task_id", taskId);
-
-        // 调用控制器方法
-        Map<String, Object> response = taskController.rewardReview(request);
-
-        // 验证返回的结果
-        assertEquals("reward_not_issued", response.get("status"));
-        assertEquals("任务奖励未被领取", response.get("message"));
-    }
-}
diff --git a/src/test/java/com/example/myproject/controller/TorrentControllerTest.java b/src/test/java/com/example/myproject/controller/TorrentControllerTest.java
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/test/java/com/example/myproject/controller/TorrentControllerTest.java
diff --git a/src/test/java/com/example/myproject/controller/UserControllerTest.java b/src/test/java/com/example/myproject/controller/UserControllerTest.java
index a97e169..d332f31 100644
--- a/src/test/java/com/example/myproject/controller/UserControllerTest.java
+++ b/src/test/java/com/example/myproject/controller/UserControllerTest.java
@@ -1,234 +1,162 @@
 package com.example.myproject.controller;
 
-import com.example.myproject.entity.Users;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.example.myproject.entity.User;
+import com.example.myproject.service.EmailService;
 import com.example.myproject.service.UserService;
-import com.example.myproject.repository.UserRepository;
+import com.example.myproject.mapper.UserMapper;
+import com.example.myproject.mapper.VerificationTokenMapper;
+import com.example.myproject.common.base.Result;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.*;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
 
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
-
-import static org.mockito.Mockito.*;
 import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
 
 class UserControllerTest {
 
-    @Mock
-    private UserService userService;
-
-    @Mock
-    private UserRepository userRepository;
-
     @InjectMocks
     private UserController userController;
 
+    @Mock
+    private UserService userService;
+    @Mock
+    private UserMapper userMapper;
+    @Mock
+    private EmailService emailService;
+    @Mock
+    private AuthenticationManager authenticationManager;
+    @Mock
+    private VerificationTokenMapper verificationTokenMapper;
+
     @BeforeEach
-    void setUp() {
-        // 初始化模拟对象
+    void setup() {
         MockitoAnnotations.openMocks(this);
     }
 
-    // 测试生成邀请码接口
     @Test
-    void testGenerateInviteCode() {
-        // 设置输入数据
-        Map<String, Object> request = new HashMap<>();
-        request.put("user_id", 1L);
+    void loginController_success() {
+        String username = "testuser";
+        String password = "testpass";
+        User mockUser = new User();
+        mockUser.setUsername(username);
 
-        // 模拟服务层的返回
-        Map<String, Object> responseMap = new HashMap<>();
-        responseMap.put("status", "success");
-        responseMap.put("message", "邀请码生成成功");
-        responseMap.put("invite_code", "ABC123XYZ");
+        Authentication mockAuth = mock(Authentication.class);
+        when(authenticationManager.authenticate(any())).thenReturn(mockAuth);
+        when(userMapper.selectOne(any(QueryWrapper.class))).thenReturn(mockUser);
 
-        when(userService.generateInviteCode(1L)).thenReturn(responseMap);
+        Result result = userController.loginController(username, password);
 
-        // 调用控制器方法
-        Map<String, Object> resultMap = userController.generateInviteCode(request);
-
-        // 验证返回结果
-        assertEquals("success", resultMap.get("status"));
-        assertEquals("邀请码生成成功", resultMap.get("message"));
-        assertEquals("ABC123XYZ", resultMap.get("invite_code"));
-
-        // 验证服务层方法是否被调用
-        verify(userService, times(1)).generateInviteCode(1L);
+        assertEquals("200", result.getCode());
+        assertEquals(mockUser, result.getData());
     }
 
-    // 测试用户修改密码接口
+
     @Test
-    void testChangePassword() {
-        Long userId = 1L;
-        Map<String, Object> request = new HashMap<>();
-        request.put("user_id", userId);
-        request.put("old_password", "oldPassword");
-        request.put("new_password", "newPassword");
-        request.put("confirm_password", "newPassword");
+    void loginController_failure() {
+        String username = "user";
+        String password = "wrongpass";
 
-        // 模拟服务层的返回
-        String resultMessage = "密码修改成功";
-        when(userService.changePassword(userId, "oldPassword", "newPassword", "newPassword"))
-                .thenReturn(resultMessage);
+        // 模拟认证失败，抛出 Bad credentials 异常
+        when(authenticationManager.authenticate(any()))
+                .thenThrow(new AuthenticationException("Bad credentials") {});
 
-        // 调用控制器方法
-        Map<String, Object> resultMap = userController.changePassword(request);
 
-        // 验证返回结果
-        assertEquals("密码修改成功", resultMap.get("message"));
-        assertEquals("success", resultMap.get("status"));
+        // 调用登录接口
+        Result result = userController.loginController(username, password);
 
-        // 验证服务层方法是否被调用
-        verify(userService, times(1)).changePassword(userId, "oldPassword", "newPassword", "newPassword");
-    }
-
-    // 测试用户注册接口
-    @Test
-    void testRegister() {
-        // 设置输入数据
-        Map<String, Object> request = new HashMap<>();
-        request.put("username", "testUser");
-        request.put("email", "test@example.com");
-        request.put("password", "password");
-        request.put("role", "USER");
-        request.put("inviteCode", "12345");
-
-        // 模拟服务层的返回
-        String resultMessage = "用户注册成功";
-        when(userService.registerUser("testUser", "test@example.com", "password", "USER", "12345"))
-                .thenReturn(resultMessage);
-
-        // 调用控制器方法
-        Map<String, Object> resultMap = userController.register(request);
-
-        // 验证返回结果
-        assertEquals("用户注册成功", resultMap.get("msg"));
-
-        // 验证服务层方法是否被调用
-        verify(userService, times(1)).registerUser("testUser", "test@example.com", "password", "USER", "12345");
+        // 断言返回的状态码和消息
+        assertEquals("401", result.getCode());
+        assertTrue(result.getMsg().contains("登录失败"));
     }
 
     @Test
-    void testLogin() {
-        String username = "testUser";
-        String password = "password";
-
-        // 模拟服务层的返回
-        String loginMessage = "登录成功";
-        when(userService.loginUser("testUser", "password")).thenReturn(loginMessage);
-
-        // 模拟用户查询
-        Users user = new Users();
-        user.setUserId(1L);
-        user.setUsername("testUser");
+    void registerController_emailExists() {
+        User user = new User();
         user.setEmail("test@example.com");
-        when(userRepository.findByUsername("testUser")).thenReturn(Optional.of(user));
 
-        // 设置请求数据
-        Map<String, Object> request = new HashMap<>();
-        request.put("username", username);
-        request.put("password", password);
+        when(userService.checkEmailExists(user.getEmail())).thenReturn(true);
 
-        // 调用控制器方法
-        Map<String, Object> resultMap = userController.login(request);
+        Result result = userController.registerController(user);
 
-        // 验证返回结果
-        assertEquals("登录成功", resultMap.get("msg"));
-
-        // 验证 user 不是 Map 类型，而是 Users 对象
-        Users loggedInUser = (Users) resultMap.get("user");
-        assertNotNull(loggedInUser);
-        assertEquals("testUser", loggedInUser.getUsername());
-        assertEquals("test@example.com", loggedInUser.getEmail());
-
-        // 验证服务层方法是否被调用
-        verify(userService, times(1)).loginUser("testUser", "password");
+        assertEquals("邮箱冲突", result.getCode());
     }
 
-
-    // 测试获取用户个人资料接口
     @Test
-    void testGetProfile() {
-        Long userId = 1L;
-
-        // Mock 用户数据
-        Users user = new Users();
-        user.setUserId(userId);
-        user.setUsername("testUser");
+    void registerController_success() {
+        User user = new User();
         user.setEmail("test@example.com");
-        user.setAvatarUrl("https://example.com/avatar.jpg");
 
-        // 模拟服务层返回
-        Map<String, Object> profileData = new HashMap<>();
-        profileData.put("avatarUrl", user.getAvatarUrl());
-        profileData.put("username", user.getUsername());
-        profileData.put("email", user.getEmail());
-        when(userService.getProfile(userId)).thenReturn(profileData);
+        when(userService.checkEmailExists(user.getEmail())).thenReturn(false);
+        when(userService.preRegisterUser(user)).thenReturn(true);
 
-        // 调用控制器方法
-        Map<String, Object> resultMap = userController.getProfile(userId);
+        Result result = userController.registerController(user);
 
-        // 验证返回结果
-        assertEquals("testUser", resultMap.get("username"));
-        assertEquals("test@example.com", resultMap.get("email"));
-        assertEquals("https://example.com/avatar.jpg", resultMap.get("avatarUrl"));
-
-        // 验证服务层方法是否被调用
-        verify(userService, times(1)).getProfile(userId);
-    }
-
-    // 测试修改用户个人资料接口
-    @Test
-    void testEditProfile() {
-        Long userId = 1L;
-        Map<String, Object> profileData = new HashMap<>();
-        profileData.put("avatarUrl", "https://example.com/avatar.jpg");
-        profileData.put("nickname", "newNickname");
-        profileData.put("gender", "Male");
-        profileData.put("description", "Updated description");
-        profileData.put("hobbies", "Reading, Hiking");
-
-        // 模拟服务层的返回
-        when(userService.editProfile(userId, "https://example.com/avatar.jpg", "newNickname", "Male", "Updated description", "Reading, Hiking"))
-                .thenReturn(true);
-
-        // 调用控制器方法
-        Map<String, String> resultMap = userController.editProfile(userId, profileData);
-
-        // 验证返回结果
-        assertEquals("用户资料更新成功", resultMap.get("message"));
-
-        // 验证服务层方法是否被调用
-        verify(userService, times(1)).editProfile(userId, "https://example.com/avatar.jpg", "newNickname", "Male", "Updated description", "Reading, Hiking");
+        assertEquals("200", result.getCode());
+        assertEquals(user.getEmail(), ((User) result.getData()).getEmail());
     }
 
     @Test
-    public void testCalculateShareRate() {
-        Long userId = 1L;
+    void verifyEmailCode_success() {
+        when(userService.verifyEmail("test@example.com", "123456")).thenReturn(true);
 
-        // 模拟 UserService 返回的结果
-        Map<String, Object> expectedResponse = Map.of(
-                "status", "success",
-                "message", "分享率计算成功",
-                "shareRate", 0.5f
-        );
+        UserController.VerificationRequest request = new UserController.VerificationRequest();
+        request.setEmail("test@example.com");
+        request.setCode("123456");
 
-        // 设置用户数据
-        Users user = new Users();
-        user.setUserId(userId);
-        user.setUploadCount(50f);  // 上传量为50
-        user.setDownloadCount(100f);  // 下载量为100
-        when(userService.calculateShareRate(userId)).thenReturn(expectedResponse);
+        Result result = userController.verifyEmailCode(request);
 
-        // 调用接口
-        Map<String, Object> result = userController.calculateShareRate(userId);
+        assertEquals("200", result.getCode());
+    }
 
-        // 验证结果
-        assertEquals(expectedResponse, result);
-        verify(userService, times(1)).calculateShareRate(userId);  // 验证服务方法是否被调用
+    @Test
+    void verifyEmailCode_failure() {
+        when(userService.verifyEmail("test@example.com", "000000")).thenReturn(false);
+
+        UserController.VerificationRequest request = new UserController.VerificationRequest();
+        request.setEmail("test@example.com");
+        request.setCode("000000");
+
+        Result result = userController.verifyEmailCode(request);
+
+        assertEquals("验证失败", result.getCode());
+    }
+
+    @Test
+    void checkPassword_success() {
+        when(userService.checkPassword(1L, "abc123")).thenReturn(true);
+
+        Result<String> result = userController.checkPassword(1L, "abc123");
+
+        assertEquals("200", result.getCode());
+        assertEquals("原始密码输入正确", result.getMsg());
+    }
+
+    @Test
+    void checkPassword_failure() {
+        when(userService.checkPassword(1L, "wrong")).thenReturn(false);
+
+        Result<String> result = userController.checkPassword(1L, "wrong");
+
+        assertEquals("305", result.getCode());
+        assertEquals("原始密码输入错误", result.getMsg());
+    }
+
+    @Test
+    void sendVerificationEmail_userNotFound() {
+        UserController.EmailRequest request = new UserController.EmailRequest();
+        request.setEmail("notfound@example.com");
+
+        when(userMapper.selectOne(any())).thenReturn(null);
+
+        ResponseEntity<Result> response = userController.sendVerificationEmail(request);
+
+        assertEquals(400, response.getStatusCodeValue());
+        assertEquals("1", response.getBody().getCode());
     }
 }
diff --git a/src/test/java/com/example/myproject/controller/UserFollowControllerTest.java b/src/test/java/com/example/myproject/controller/UserFollowControllerTest.java
deleted file mode 100644
index 29bf47f..0000000
--- a/src/test/java/com/example/myproject/controller/UserFollowControllerTest.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package com.example.myproject.controller;
-
-import com.example.myproject.controller.UserFollowController;
-import com.example.myproject.service.UserFollowService;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.springframework.http.ResponseEntity;
-import java.util.List;
-
-import java.util.Map;
-
-import static org.mockito.Mockito.*;
-import static org.junit.jupiter.api.Assertions.*;
-
-class UserFollowControllerTest {
-
-    @InjectMocks
-    private UserFollowController userFollowController;
-
-    @Mock
-    private UserFollowService userFollowService;
-
-    @BeforeEach
-    void setup() {
-        MockitoAnnotations.openMocks(this);
-    }
-
-    // 测试用户关注接口
-    @Test
-    void testFollow() {
-        Long followerId = 1L;
-        Long followedId = 2L;
-        Map<String, Object> mockResponse = Map.of(
-                "status", "success",
-                "message", "关注成功"
-        );
-
-        // 模拟 userFollowService.follow() 返回
-        when(userFollowService.follow(followerId, followedId)).thenReturn(mockResponse);
-
-        // 创建请求体
-        Map<String, Long> request = Map.of("follower_id", followerId);
-
-        // 调用控制器方法
-        ResponseEntity<Map<String, Object>> responseEntity = userFollowController.follow(followedId, request);
-
-        // 验证返回的状态码和内容
-        assertEquals(200, responseEntity.getStatusCodeValue());
-        assertEquals("success", responseEntity.getBody().get("status"));
-        assertEquals("关注成功", responseEntity.getBody().get("message"));
-    }
-
-    // 测试取消关注接口
-    @Test
-    void testUnfollow() {
-        Long followerId = 1L;
-        Long followedId = 2L;
-        Map<String, Object> mockResponse = Map.of(
-                "status", "success",
-                "message", "取消关注成功"
-        );
-
-        // 模拟 userFollowService.unfollow() 返回
-        when(userFollowService.unfollow(followerId, followedId)).thenReturn(mockResponse);
-
-        // 创建请求体
-        Map<String, Long> request = Map.of("follower_id", followerId);
-
-        // 调用控制器方法
-        ResponseEntity<Map<String, Object>> responseEntity = userFollowController.unfollow(followedId, request);
-
-        // 验证返回的状态码和内容
-        assertEquals(200, responseEntity.getStatusCodeValue());
-        assertEquals("success", responseEntity.getBody().get("status"));
-        assertEquals("取消关注成功", responseEntity.getBody().get("message"));
-    }
-
-    // 测试获取某个用户的粉丝列表接口
-    @Test
-    void testGetFollowers() {
-        Long userId = 1L;
-        Map<String, Object> mockResponse = Map.of(
-                "status", "success",
-                "total", 2,
-                "followers", List.of(
-                        Map.of("user_id", 2L, "username", "user2", "avatar_url", "url2"),
-                        Map.of("user_id", 3L, "username", "user3", "avatar_url", "url3")
-                )
-        );
-
-        // 模拟 userFollowService.getFollowers() 返回
-        when(userFollowService.getFollowers(userId)).thenReturn(mockResponse);
-
-        // 调用控制器方法
-        ResponseEntity<Map<String, Object>> responseEntity = userFollowController.getFollowers(userId);
-
-        // 验证返回的状态码和内容
-        assertEquals(200, responseEntity.getStatusCodeValue());
-        assertEquals("success", responseEntity.getBody().get("status"));
-        assertEquals(2, responseEntity.getBody().get("total"));
-        assertEquals(2, ((List<?>) responseEntity.getBody().get("followers")).size());
-    }
-
-    // 测试获取某个用户的关注列表接口
-    @Test
-    void testGetFollowing() {
-        Long userId = 1L;
-        Map<String, Object> mockResponse = Map.of(
-                "status", "success",
-                "total", 2,
-                "following", List.of(
-                        Map.of("user_id", 2L, "username", "user2", "avatar_url", "url2"),
-                        Map.of("user_id", 3L, "username", "user3", "avatar_url", "url3")
-                )
-        );
-
-        // 模拟 userFollowService.getFollowing() 返回
-        when(userFollowService.getFollowing(userId)).thenReturn(mockResponse);
-
-        // 调用控制器方法
-        ResponseEntity<Map<String, Object>> responseEntity = userFollowController.getFollowing(userId);
-
-        // 验证返回的状态码和内容
-        assertEquals(200, responseEntity.getStatusCodeValue());
-        assertEquals("success", responseEntity.getBody().get("status"));
-        assertEquals(2, responseEntity.getBody().get("total"));
-        assertEquals(2, ((List<?>) responseEntity.getBody().get("following")).size());
-    }
-}
diff --git a/src/test/java/com/example/myproject/controller/UserMessageControllerTest.java b/src/test/java/com/example/myproject/controller/UserMessageControllerTest.java
deleted file mode 100644
index 4fcbcc7..0000000
--- a/src/test/java/com/example/myproject/controller/UserMessageControllerTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package com.example.myproject.controller;
-
-import com.example.myproject.service.UserMessageService;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.springframework.http.ResponseEntity;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.mockito.Mockito.when;
-
-class UserMessageControllerTest {
-
-    @InjectMocks
-    private UserMessageController userMessageController;
-
-    @Mock
-    private UserMessageService userMessageService;
-
-    @BeforeEach
-    void setup() {
-        MockitoAnnotations.openMocks(this);
-    }
-
-    @Test
-    void testSendMessage() {
-        // 准备测试数据
-        Map<String, Object> params = new HashMap<>();
-        params.put("sender_id", 1L);
-        params.put("receiver_id", 2L);
-        params.put("content", "测试消息");
-
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("status", "success");
-        mockResponse.put("message", "私信发送成功");
-        mockResponse.put("message_id", 100L);
-
-        // 模拟Service方法调用
-        when(userMessageService.sendMessage(1L, 2L, "测试消息")).thenReturn(mockResponse);
-
-        // 执行测试
-        ResponseEntity<Map<String, Object>> response = userMessageController.sendMessage(params);
-
-        // 验证结果
-        assertEquals(200, response.getStatusCodeValue());
-        assertEquals("success", response.getBody().get("status"));
-        assertEquals("私信发送成功", response.getBody().get("message"));
-        assertEquals(100L, response.getBody().get("message_id"));
-    }
-
-    @Test
-    void testGetUserMessages() {
-        // 准备测试数据
-        Long userId = 1L;
-
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("status", "success");
-        mockResponse.put("messages", new HashMap<>());
-
-        // 模拟Service方法调用
-        when(userMessageService.getUserMessages(userId)).thenReturn(mockResponse);
-
-        // 执行测试
-        ResponseEntity<Map<String, Object>> response = userMessageController.getUserMessages(userId);
-
-        // 验证结果
-        assertEquals(200, response.getStatusCodeValue());
-        assertEquals("success", response.getBody().get("status"));
-    }
-
-    @Test
-    void testGetMessage() {
-        // 准备测试数据
-        Long messageId = 1L;
-
-        Map<String, Object> mockResponse = new HashMap<>();
-        mockResponse.put("status", "success");
-        mockResponse.put("message", new HashMap<>());
-
-        // 模拟Service方法调用
-        when(userMessageService.getMessage(messageId)).thenReturn(mockResponse);
-
-        // 执行测试
-        ResponseEntity<Map<String, Object>> response = userMessageController.getMessage(messageId);
-
-        // 验证结果
-        assertEquals(200, response.getStatusCodeValue());
-        assertEquals("success", response.getBody().get("status"));
-    }
-}
\ No newline at end of file
