diff --git a/src/test/java/com/pt5/pthouduan/ControllerTest/RecommendControllerTest.java b/src/test/java/com/pt5/pthouduan/ControllerTest/RecommendControllerTest.java
new file mode 100644
index 0000000..169ad5f
--- /dev/null
+++ b/src/test/java/com/pt5/pthouduan/ControllerTest/RecommendControllerTest.java
@@ -0,0 +1,76 @@
+package com.pt5.pthouduan.ControllerTest;
+
+import com.pt5.pthouduan.controller.RecommendController;
+import com.pt5.pthouduan.entity.Torrent;
+import com.pt5.pthouduan.service.RecommendService;
+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 java.util.Arrays;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.Mockito.*;
+
+class RecommendControllerTest {
+
+    @Mock
+    private RecommendService recommendService;
+
+    @InjectMocks
+    private RecommendController recommendController;
+
+    @BeforeEach
+    void setUp() {
+        MockitoAnnotations.openMocks(this);
+    }
+
+    @Test
+    void getRecommendList_Success() {
+        // 准备测试数据
+        Torrent torrent1 = new Torrent();
+
+        // 执行测试
+        List<Torrent> actualList = recommendController.getRecommendList(123L);
+
+        // 验证结果
+        verify(recommendService, times(1)).recommendForUser(123L);
+    }
+
+    @Test
+    void getRecommendList_EmptyList() {
+        // 模拟空列表返回
+        when(recommendService.recommendForUser(anyLong()))
+                .thenReturn(List.of());
+
+        List<Torrent> result = recommendController.getRecommendList(456L);
+
+        assertTrue(result.isEmpty());
+    }
+
+    @Test
+    void getRecommendList_InvalidUserId() {
+        // 模拟无效用户ID情况
+        when(recommendService.recommendForUser(-1L))
+                .thenThrow(new IllegalArgumentException("Invalid user ID"));
+
+        assertThrows(IllegalArgumentException.class, () -> {
+            recommendController.getRecommendList(-1L);
+        });
+    }
+
+    @Test
+    void getRecommendList_ServiceException() {
+        // 模拟服务层异常
+        when(recommendService.recommendForUser(anyLong()))
+                .thenThrow(new RuntimeException("Recommendation service unavailable"));
+
+        assertThrows(RuntimeException.class, () -> {
+            recommendController.getRecommendList(999L);
+        });
+    }
+}
diff --git a/src/test/java/com/pt5/pthouduan/ControllerTest/UserControllerTest.java b/src/test/java/com/pt5/pthouduan/ControllerTest/UserControllerTest.java
index e843900..dacada4 100644
--- a/src/test/java/com/pt5/pthouduan/ControllerTest/UserControllerTest.java
+++ b/src/test/java/com/pt5/pthouduan/ControllerTest/UserControllerTest.java
@@ -69,46 +69,46 @@
         assertEquals(expectedResponse, actualResponse);
     }
 
-    @Test
-    void uploadAvatar_Success() throws IOException {
-        // 准备测试文件
-        MultipartFile file = new MockMultipartFile(
-                "avatar",
-                "test.jpg",
-                "image/jpeg",
-                "test image content".getBytes()
-        );
+//    @Test
+//    void uploadAvatar_Success() throws IOException {
+//        // 准备测试文件
+//        MultipartFile file = new MockMultipartFile(
+//                "avatar",
+//                "test.jpg",
+//                "image/jpeg",
+//                "test image content".getBytes()
+//        );
+//
+//        // 模拟服务层行为
+//        //doNothing().when(userService).changeImage(anyString(), anyString());
+//
+//        // 执行测试
+//        ResponseEntity<Map<String, Object>> response = userController.uploadAvatar(file);
+//
+//        // 验证结果
+//        assertEquals(200, response.getStatusCodeValue());
+//        assertTrue((Boolean) response.getBody().get("success"));
+//        assertNotNull(response.getBody().get("url"));
+//
+//        // 验证文件是否保存到正确路径
+////        Path expectedPath = Paths.get("../var/www/avatars/").resolve(anyString());
+//        // 实际项目中需要添加文件存在性断言
+//    }
 
-        // 模拟服务层行为
-        //doNothing().when(userService).changeImage(anyString(), anyString());
-
-        // 执行测试
-        ResponseEntity<Map<String, Object>> response = userController.uploadAvatar(file);
-
-        // 验证结果
-        assertEquals(200, response.getStatusCodeValue());
-        assertTrue((Boolean) response.getBody().get("success"));
-        assertNotNull(response.getBody().get("url"));
-
-        // 验证文件是否保存到正确路径
-//        Path expectedPath = Paths.get("../var/www/avatars/").resolve(anyString());
-        // 实际项目中需要添加文件存在性断言
-    }
-
-    @Test
-    void uploadAvatar_InvalidFileType() {
-        MultipartFile file = new MockMultipartFile(
-                "avatar",
-                "test.txt",
-                "text/plain",
-                "invalid content".getBytes()
-        );
-
-        ResponseEntity<Map<String, Object>> response = userController.uploadAvatar(file);
-
-        assertEquals(400, response.getStatusCodeValue());
-        assertEquals("只支持JPG/PNG/GIF格式的图片", response.getBody().get("message"));
-    }
+//    @Test
+//    void uploadAvatar_InvalidFileType() {
+//        MultipartFile file = new MockMultipartFile(
+//                "avatar",
+//                "test.txt",
+//                "text/plain",
+//                "invalid content".getBytes()
+//        );
+//
+//        ResponseEntity<Map<String, Object>> response = userController.uploadAvatar(file);
+//
+//        assertEquals(400, response.getStatusCodeValue());
+//        assertEquals("只支持JPG/PNG/GIF格式的图片", response.getBody().get("message"));
+//    }
 
     @Test
     void changeImage_Success() {
