diff --git a/src/test/java/com/g9/g9backend/controller/UserControllerTest.java b/src/test/java/com/g9/g9backend/controller/UserControllerTest.java
index 3f06b32..bec8b11 100644
--- a/src/test/java/com/g9/g9backend/controller/UserControllerTest.java
+++ b/src/test/java/com/g9/g9backend/controller/UserControllerTest.java
@@ -1,5 +1,7 @@
 package com.g9.g9backend.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.g9.g9backend.pojo.*;
 import com.g9.g9backend.pojo.DTO.*;
@@ -13,6 +15,10 @@
 import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.when;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
@@ -37,6 +43,21 @@
     @Mock
     private SearchHistoryService searchHistoryService;
 
+    @Mock
+    private RewardService rewardService;
+
+    @Mock
+    private UserCollectionService userCollectionService;
+
+    @Mock
+    private UserUploadService userUploadService;
+
+    @Mock
+    private UserPurchaseService userPurchaseService;
+
+    @Mock
+    private ResourceService resourceService;
+
     private final ObjectMapper objectMapper = new ObjectMapper();
 
     @BeforeEach
@@ -218,4 +239,170 @@
                         .param("followerId", "2"))
                 .andExpect(status().isNoContent());
     }
+
+    // 获取用户ID
+    @Test
+    public void testGetUserId() throws Exception {
+
+        when(userService.getOne(any())).thenReturn(new User(1, "hcy", "123", null, 0, 0, null, 0, 0, 0));
+
+        mockMvc.perform(get("/user/getId")
+                        .param("username", "hcy")
+                        .param("password", "123"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取邀请码
+    @Test
+    public void testGetInvitationCode() throws Exception {
+
+        List<Invitation> invitationList = new ArrayList<>();
+        invitationList.add(new Invitation("1RCA7Y8J", 0, 0));
+        invitationList.add(new Invitation("2RCA7Y8J", 0, 0));
+        invitationList.add(new Invitation("3RCA7Y8J", 0, 0));
+        invitationList.add(new Invitation("4RCA7Y8J", 0, 0));
+        invitationList.add(new Invitation("5RCA7Y8J", 0, 0));
+
+        QueryWrapper<Invitation> invitationQuery = new QueryWrapper<>();
+        invitationQuery.eq("user_id", 1).eq("invitee_id", 0);
+        invitationQuery.select("invitation_code");
+
+        when(invitationService.list(invitationQuery)).thenReturn(invitationList); //这里用any()无法识别，因为list有多种参数可能
+
+        mockMvc.perform(get("/user/invitation-code")
+                        .param("userId", "1"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取用户信息
+    @Test
+    public void testGetUserInfo() throws Exception {
+
+        when(userService.getById(anyInt())).thenReturn(new User(1, "user", "pass", null, 0, 0, null, 0, 0, 0));
+
+        mockMvc.perform(get("/user/info")
+                        .param("userId", "1"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取悬赏
+    @Test
+    public void testGetUserReward() throws Exception {
+
+        when(rewardService.page(any(), any())).thenReturn(new Page<>(1, 2));
+
+        mockMvc.perform(get("/user/reward")
+                        .param("userId", "1")
+                        .param("pageNumber", "2")
+                        .param("rows", "2"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取收藏
+    @Test
+    public void testGetUserCollection() throws Exception {
+
+        when(userCollectionService.page(any(), any())).thenReturn(new Page<>(1, 2));
+        when(resourceService.getById(anyInt())).thenReturn(new Resource(1, "a", null, null, null, new Date(), new Date(), 100, 0, 0, 0, 0, 0, "mod"));
+
+        mockMvc.perform(get("/user/collection")
+                        .param("userId", "1")
+                        .param("pageNumber", "1")
+                        .param("rows", "2"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取上传
+    @Test
+    public void testGetUserUpload() throws Exception {
+
+        when(userUploadService.page(any(), any())).thenReturn(new Page<>(1, 2));
+        when(resourceService.getById(anyInt())).thenReturn(new Resource(1, "a", null, null, null, new Date(), new Date(), 100, 0, 0, 0, 0, 0, "mod"));
+
+        mockMvc.perform(get("/user/upload")
+                        .param("userId", "1")
+                        .param("pageNumber", "1")
+                        .param("rows", "2"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取购买
+    @Test
+    public void testGetUserPurchase() throws Exception {
+
+        when(userPurchaseService.page(any(), any())).thenReturn(new Page<>(1, 2));
+        when(resourceService.getById(anyInt())).thenReturn(new Resource(1, "a", null, null, null, new Date(), new Date(), 100, 0, 0, 0, 0, 0, "mod"));
+
+        mockMvc.perform(get("/user/purchase")
+                        .param("userId", "1")
+                        .param("pageNumber", "1")
+                        .param("rows", "2"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取搜索历史
+    @Test
+    public void testGetUserSearchHistory() throws Exception {
+
+        List<SearchHistory> searchHistoryList = new ArrayList<>();
+
+        QueryWrapper<SearchHistory> searchHistoryQuery = new QueryWrapper<>();
+        searchHistoryQuery.eq("user_id", 1).orderByDesc("search_history_id").last("LIMIT 10");
+
+        when(searchHistoryService.list(searchHistoryQuery)).thenReturn(searchHistoryList);
+
+        mockMvc.perform(get("/user/search")
+                        .param("userId", "1"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取用户数据
+    @Test
+    public void testGetUserData() throws Exception {
+
+        when(userService.getById(1)).thenReturn(new User(1, "hcy", "123", null, 0, 0, null, 0, 0, 0));
+
+        List<UserUpload> UserUpload = new ArrayList<>();
+        QueryWrapper<UserUpload> userUploadQuery = new QueryWrapper<>();
+        userUploadQuery.eq("user_id", 1);
+        when(userUploadService.list(userUploadQuery)).thenReturn(UserUpload);
+
+        when(resourceService.getById(anyInt())).thenReturn(new Resource());
+
+        mockMvc.perform(get("/user/data")
+                        .param("userId", "1"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取关注列表
+    @Test
+    public void testGetUserSubscriber() throws Exception {
+
+        QueryWrapper<Subscription> subscriptionQuery = new QueryWrapper<>();
+        subscriptionQuery.eq("follower_id", 1);
+        List<Subscription> subscriptionList = new ArrayList<>();
+
+        when(subscriptionService.list(subscriptionQuery)).thenReturn(subscriptionList);
+        when(userService.getById(1)).thenReturn(new User(1, "hcy", "123", null, 0, 0, null, 0, 0, 0));
+
+        mockMvc.perform(get("/user/subscriber")
+                        .param("userId", "1"))
+                .andExpect(status().isOk());
+    }
+
+    // 获取粉丝列表
+    @Test
+    public void testGetUserFollower() throws Exception {
+
+        QueryWrapper<Subscription> subscriptionQuery = new QueryWrapper<>();
+        subscriptionQuery.eq("user_id", 1);
+        List<Subscription> subscriptionList = new ArrayList<>();
+
+        when(subscriptionService.list(subscriptionQuery)).thenReturn(subscriptionList);
+        when(userService.getById(1)).thenReturn(new User(1, "hcy", "123", null, 0, 0, null, 0, 0, 0));
+
+        mockMvc.perform(get("/user/follower")
+                        .param("userId", "1"))
+                .andExpect(status().isOk());
+    }
 }
\ No newline at end of file
