diff --git a/src/test/java/com/pt5/pthouduan/ControllerTest/UserControllerTest.java b/src/test/java/com/pt5/pthouduan/ControllerTest/UserControllerTest.java
index 00c8354..18707e2 100644
--- a/src/test/java/com/pt5/pthouduan/ControllerTest/UserControllerTest.java
+++ b/src/test/java/com/pt5/pthouduan/ControllerTest/UserControllerTest.java
@@ -1,5 +1,4 @@
 package com.pt5.pthouduan.ControllerTest;
-
 import com.pt5.pthouduan.controller.UserController;
 import com.pt5.pthouduan.entity.User;
 import com.pt5.pthouduan.service.UserService;
@@ -14,7 +13,8 @@
 import java.util.Map;
 
 import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.*;
 
 class UserControllerTest {
@@ -30,193 +30,103 @@
         MockitoAnnotations.openMocks(this);
     }
 
-    // 注册测试
+    // 测试注册功能
     @Test
-    void register_ShouldCallServiceWithCorrectParameters() {
-        // 准备测试数据
-        User testUser = new User(1L,"");
-        testUser.setUsername("testUser");
-        String testCode = "123456";
-        Map<String, Object> expectedResponse = new HashMap<>();
-        expectedResponse.put("success", true);
-        expectedResponse.put("message", "注册成功");
+    void register_ShouldReturnSuccess() {
+        User user = new User(0L,"1");
+        user.setUsername("testUser");
+        Map<String, Object> expected = new HashMap<>();
+        expected.put("status", "success");
 
-        // 模拟服务行为
-        when(userService.register(any(User.class), anyString())).thenReturn(expectedResponse);
+        when(userService.register(any(User.class), anyString(), anyString()))
+                .thenReturn(expected);
 
-        // 执行测试
-        Map<String, Object> actualResponse = userController.register(testUser, testCode);
+        Map<String, Object> result = userController.register(user, "INVITE123", "EMAIL456");
 
-        // 验证行为
-        verify(userService, times(1)).register(testUser, testCode);
-
-        // 验证结果
-        assertEquals(expectedResponse, actualResponse);
+        assertEquals(expected, result);
+        verify(userService, times(1)).register(any(), anyString(), anyString());
     }
 
-    // 登录测试
+    // 测试登录功能
     @Test
-    void login_ShouldReturnSuccessWhenCredentialsAreValid() {
-        // 准备测试数据
-        String username = "testUser";
-        String password = "correctPassword";
-        Map<String, Object> expectedResponse = new HashMap<>();
-        expectedResponse.put("success", true);
-        expectedResponse.put("token", "sampleToken");
+    void login_ShouldReturnToken() {
+        Map<String, Object> expected = new HashMap<>();
+        expected.put("token", "mockToken123");
 
-        // 模拟服务行为
-        when(userService.login(eq(username), eq(password))).thenReturn(expectedResponse);
+        when(userService.login("testUser", "password123"))
+                .thenReturn(expected);
 
-        // 执行测试
-        Map<String, Object> actualResponse = userController.login(username, password);
+        Map<String, Object> result = userController.login("testUser", "password123");
 
-        // 验证行为
-        verify(userService, times(1)).login(username, password);
-
-        // 验证结果
-        assertEquals(expectedResponse, actualResponse);
-        assertTrue((Boolean) actualResponse.get("success"));
-        assertNotNull(actualResponse.get("token"));
+        assertEquals(expected, result);
+        assertNotNull(result.get("token"));
     }
 
-    // 计算等级测试
+    // 测试获取用户信息
     @Test
-    void calgrade_ShouldReturnUserGrade() {
-        // 准备测试数据
-        String username = "testUser";
-        Map<String, Object> expectedResponse = new HashMap<>();
-        expectedResponse.put("grade", 5);
-        expectedResponse.put("exp", 1200);
+    void getUserInfo_ShouldReturnUserData() {
+        Map<String, Object> expected = new HashMap<>();
+        expected.put("username", "testUser");
+        expected.put("email", "test@example.com");
 
-        // 模拟服务行为
-        when(userService.CalGrade(eq(username))).thenReturn(expectedResponse);
+        when(userService.UserInfo("testUser"))
+                .thenReturn(expected);
 
-        // 执行测试
-        Map<String, Object> actualResponse = userController.calgrade(username);
+        Map<String, Object> result = userController.getuser("testUser");
 
-        // 验证行为
-        verify(userService, times(1)).CalGrade(username);
-
-        // 验证结果
-        assertEquals(5, actualResponse.get("grade"));
-        assertEquals(1200, actualResponse.get("exp"));
+        assertEquals("testUser", result.get("username"));
+        assertEquals("test@example.com", result.get("email"));
     }
 
-    // 修改性别测试
+    // 测试修改密码
     @Test
-    void changesex_ShouldUpdateUserSex() {
-        // 准备测试数据
-        String username = "testUser";
-        String newSex = "male";
-        Map<String, Object> expectedResponse = new HashMap<>();
-        expectedResponse.put("success", true);
-        expectedResponse.put("message", "性别更新成功");
+    void changePassword_ShouldHandleSuccess() {
+        Map<String, Object> expected = new HashMap<>();
+        expected.put("message", "Password updated");
 
-        // 模拟服务行为
-        when(userService.changesex(eq(username), eq(newSex))).thenReturn(expectedResponse);
+        when(userService.changePassword("testUser", "oldPass", "newPass"))
+                .thenReturn(expected);
 
-        // 执行测试
-        Map<String, Object> actualResponse = userController.changsex(username, newSex);
+        Map<String, Object> result = userController.changePassword(
+                "testUser", "oldPass", "newPass");
 
-        // 验证行为
-        verify(userService, times(1)).changesex(username, newSex);
-
-        // 验证结果
-        assertTrue((Boolean) actualResponse.get("success"));
-        assertEquals("性别更新成功", actualResponse.get("message"));
+        assertEquals("Password updated", result.get("message"));
     }
 
-    // 修改头像测试
+    // 测试异常情况
     @Test
-    void changeimage_ShouldUpdateUserImage() {
-        // 准备测试数据
-        String username = "testUser";
-        String newImage = "newImageUrl";
-        Map<String, Object> expectedResponse = new HashMap<>();
-        expectedResponse.put("success", true);
-        expectedResponse.put("message", "头像更新成功");
+    void login_ShouldHandleFailure() {
+        when(userService.login("wrongUser", "wrongPass"))
+                .thenThrow(new RuntimeException("Invalid credentials"));
 
-        // 模拟服务行为
-        when(userService.changeImage(eq(username), eq(newImage))).thenReturn(expectedResponse);
-
-        // 执行测试
-        Map<String, Object> actualResponse = userController.changeimage(username, newImage);
-
-        // 验证行为
-        verify(userService, times(1)).changeImage(username, newImage);
-
-        // 验证结果
-        assertTrue((Boolean) actualResponse.get("success"));
-        assertEquals("头像更新成功", actualResponse.get("message"));
+        assertThrows(RuntimeException.class, () -> {
+            userController.login("wrongUser", "wrongPass");
+        });
     }
 
-    // 修改密码测试
+    // 测试空参数情况
     @Test
-    void changePassword_ShouldReturnSuccessWhenOldPasswordIsCorrect() {
-        // 准备测试数据
-        String username = "testUser";
-        String oldPassword = "correctOldPassword";
-        String newPassword = "newSecurePassword";
-        Map<String, Object> expectedResponse = new HashMap<>();
-        expectedResponse.put("success", true);
-        expectedResponse.put("message", "密码修改成功");
+    void getUserInfo_ShouldHandleNullUsername() {
+        when(userService.UserInfo(null))
+                .thenReturn(Map.of("error", "Username required"));
 
-        // 模拟服务行为
-        when(userService.changePassword(eq(username), eq(oldPassword), eq(newPassword)))
-                .thenReturn(expectedResponse);
+        Map<String, Object> result = userController.getuser(null);
 
-        // 执行测试
-        Map<String, Object> actualResponse = userController.changePassword(username, oldPassword, newPassword);
-
-        // 验证行为
-        verify(userService, times(1)).changePassword(username, oldPassword, newPassword);
-
-        // 验证结果
-        assertTrue((Boolean) actualResponse.get("success"));
-        assertEquals("密码修改成功", actualResponse.get("message"));
+        assertEquals("Username required", result.get("error"));
     }
 
-    // 获取用户信息测试
+    // 测试创建用户
     @Test
-    void getUserInfo_ShouldReturnUserInfo() {
-        // 准备测试数据
-        String username = "testUser";
-        Map<String, Object> expectedResponse = new HashMap<>();
-        expectedResponse.put("username", username);
-        expectedResponse.put("email", "test@example.com");
+    void createUser_ShouldReturnUserId() {
+        User newUser = new User(0L,"1");
+        newUser.setUsername("newUser");
+        Map<String, Object> expected = Map.of("userId", 123);
 
-        // 模拟服务行为
-        when(userService.login(eq(username), eq(""))).thenReturn(expectedResponse);
+        when(userService.CreateUser(any(User.class)))
+                .thenReturn(expected);
 
-        // 执行测试
-        Map<String, Object> actualResponse = userController.getUserInfo(username);
+        Map<String, Object> result = userController.creatUser(newUser);
 
-        // 验证行为
-        verify(userService, times(1)).login(username, "");
-
-        // 验证结果
-        assertEquals(username, actualResponse.get("username"));
-        assertEquals("test@example.com", actualResponse.get("email"));
-    }
-
-    // 异常情况测试
-    @Test
-    void login_ShouldReturnFailureWhenCredentialsAreInvalid() {
-        // 准备测试数据
-        String username = "testUser";
-        String wrongPassword = "wrongPassword";
-        Map<String, Object> expectedResponse = new HashMap<>();
-        expectedResponse.put("success", false);
-        expectedResponse.put("message", "用户名或密码错误");
-
-        // 模拟服务行为
-        when(userService.login(eq(username), eq(wrongPassword))).thenReturn(expectedResponse);
-
-        // 执行测试
-        Map<String, Object> actualResponse = userController.login(username, wrongPassword);
-
-        // 验证结果
-        assertFalse((Boolean) actualResponse.get("success"));
-        assertEquals("用户名或密码错误", actualResponse.get("message"));
+        assertEquals(123, result.get("userId"));
     }
 }
