diff --git a/src/test/java/edu/bjtu/groupone/backend/CategoryControllerTest.java b/src/test/java/edu/bjtu/groupone/backend/CategoryControllerTest.java
deleted file mode 100644
index 23b8e65..0000000
--- a/src/test/java/edu/bjtu/groupone/backend/CategoryControllerTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package edu.bjtu.groupone.backend;
-
-import edu.bjtu.groupone.backend.api.CategoryController;
-import edu.bjtu.groupone.backend.domain.dto.CategoryDTO;
-import edu.bjtu.groupone.backend.domain.entity.Category;
-import edu.bjtu.groupone.backend.service.CategoryService;
-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.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-
-import java.util.List;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.*;
-
-@ExtendWith(MockitoExtension.class)
-class CategoryControllerTest {
-
-    @Mock
-    private CategoryService categoryService;
-
-    @InjectMocks
-    private CategoryController categoryController;
-
-    private Category testCategory;
-
-    @BeforeEach
-    void setUp() {
-        testCategory = new Category();
-        testCategory.setId(1L);
-        testCategory.setName("Test Category");
-    }
-
-    @Test
-    void createCategory_shouldReturnSuccess() {
-        // 调用
-        ResponseEntity<String> response = categoryController.createCategory(testCategory);
-
-        // 验证
-        assertEquals(HttpStatus.OK, response.getStatusCode());
-        assertEquals("分区创建成功", response.getBody());
-        verify(categoryService, times(1)).addCategory(any(Category.class));
-    }
-
-    @Test
-    void deleteCategory_shouldReturnSuccess() {
-        // 调用
-        ResponseEntity<String> response = categoryController.deleteCategory(1L);
-
-        // 验证
-        assertEquals(HttpStatus.OK, response.getStatusCode());
-        assertEquals("分区删除成功", response.getBody());
-        verify(categoryService, times(1)).deleteCategory(1L);
-    }
-
-    @Test
-    void updateCategory_shouldReturnSuccess() {
-        // 调用
-        ResponseEntity<String> response = categoryController.updateCategory(1L, testCategory);
-
-        // 验证
-        assertEquals(HttpStatus.OK, response.getStatusCode());
-        assertEquals("分区更新成功", response.getBody());
-        verify(categoryService, times(1)).updateCategory(any(Category.class));
-    }
-
-    @Test
-    void getCategory_shouldReturnCategory() {
-        // 模拟
-        when(categoryService.getCategoryById(1L)).thenReturn(testCategory);
-
-        // 调用
-        ResponseEntity<Category> response = categoryController.getCategory(1L);
-
-        // 验证
-        assertEquals(HttpStatus.OK, response.getStatusCode());
-        assertEquals(testCategory, response.getBody());
-        verify(categoryService, times(1)).getCategoryById(1L);
-    }
-
-    @Test
-    void getCategories_shouldReturnTree() {
-        // 模拟
-        CategoryDTO root = new CategoryDTO(1L, "Root");
-        root.getChildren().add(new CategoryDTO(2L, "Child"));
-        when(categoryService.getCategoryTree()).thenReturn(List.of(root));
-
-        // 调用
-        ResponseEntity<List<CategoryDTO>> response = categoryController.getCategories();
-
-        // 验证
-        assertEquals(HttpStatus.OK, response.getStatusCode());
-        assertEquals(1, response.getBody().size());
-        assertEquals(1, response.getBody().get(0).getChildren().size());
-        verify(categoryService, times(1)).getCategoryTree();
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/edu/bjtu/groupone/backend/CommentServiceTest.java b/src/test/java/edu/bjtu/groupone/backend/CommentServiceTest.java
new file mode 100644
index 0000000..50ea9ba
--- /dev/null
+++ b/src/test/java/edu/bjtu/groupone/backend/CommentServiceTest.java
@@ -0,0 +1,81 @@
+package edu.bjtu.groupone.backend;
+
+import edu.bjtu.groupone.backend.domain.entity.Comment;
+import edu.bjtu.groupone.backend.mapper.CommentMapper;
+import edu.bjtu.groupone.backend.service.impl.CommentServiceImpl;
+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 java.util.Arrays;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.*;
+
+@ExtendWith(MockitoExtension.class)
+public class CommentServiceTest {
+
+    @Mock
+    private CommentMapper commentMapper;
+
+    @InjectMocks
+    private CommentServiceImpl commentService;
+
+    private Comment comment;
+    private List<Comment> comments;
+
+    @BeforeEach
+    void setUp() {
+        comment = new Comment(1L, 1L, 1, "测试评论", "2023-06-15");
+        comments = Arrays.asList(comment);
+    }
+
+    @Test
+    void addComment() {
+        doNothing().when(commentMapper).insertComment(any(Comment.class));
+
+        commentService.addComment(comment);
+
+        verify(commentMapper, times(1)).insertComment(comment);
+    }
+
+    @Test
+    void deleteComment() {
+        doNothing().when(commentMapper).deleteComment(1L);
+
+        commentService.deleteComment(1L);
+
+        verify(commentMapper, times(1)).deleteComment(1L);
+    }
+
+    @Test
+    void updateComment() {
+        doNothing().when(commentMapper).updateComment(any(Comment.class));
+
+        commentService.updateComment(comment);
+
+        verify(commentMapper, times(1)).updateComment(comment);
+    }
+
+    @Test
+    void getCommentById() {
+        when(commentMapper.selectCommentById(1L)).thenReturn(comment);
+
+        Comment result = commentService.getCommentById(1L);
+
+        assertEquals(comment, result);
+    }
+
+    @Test
+    void getCommentsByPostId() {
+        when(commentMapper.selectCommentsByPostId(1L)).thenReturn(comments);
+
+        List<Comment> result = commentService.getCommentsByPostId(1L);
+
+        assertEquals(comments, result);
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/edu/bjtu/groupone/backend/PostServiceTest.java b/src/test/java/edu/bjtu/groupone/backend/PostServiceTest.java
new file mode 100644
index 0000000..5426db8
--- /dev/null
+++ b/src/test/java/edu/bjtu/groupone/backend/PostServiceTest.java
@@ -0,0 +1,81 @@
+package edu.bjtu.groupone.backend;
+
+import edu.bjtu.groupone.backend.domain.entity.Post;
+import edu.bjtu.groupone.backend.mapper.PostMapper;
+import edu.bjtu.groupone.backend.service.impl.PostServiceImpl;
+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 java.util.Arrays;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.*;
+
+@ExtendWith(MockitoExtension.class)
+public class PostServiceTest {
+
+    @Mock
+    private PostMapper postMapper;
+
+    @InjectMocks
+    private PostServiceImpl postService;
+
+    private Post post;
+    private List<Post> posts;
+
+    @BeforeEach
+    void setUp() {
+        post = new Post(1L, 1, "测试帖子", "内容", "2023-06-15", 100);
+        posts = Arrays.asList(post);
+    }
+
+    @Test
+    void addPost() {
+        doNothing().when(postMapper).insertPost(any(Post.class));
+
+        postService.addPost(post);
+
+        verify(postMapper, times(1)).insertPost(post);
+    }
+
+    @Test
+    void deletePost() {
+        doNothing().when(postMapper).deletePost(1L);
+
+        postService.deletePost(1L);
+
+        verify(postMapper, times(1)).deletePost(1L);
+    }
+
+    @Test
+    void updatePost() {
+        doNothing().when(postMapper).updatePost(any(Post.class));
+
+        postService.updatePost(post);
+
+        verify(postMapper, times(1)).updatePost(post);
+    }
+
+    @Test
+    void getPostById() {
+        when(postMapper.selectPostById(1L)).thenReturn(post);
+
+        Post result = postService.getPostById(1L);
+
+        assertEquals(post, result);
+    }
+
+    @Test
+    void getAllPosts() {
+        when(postMapper.selectAllPosts()).thenReturn(posts);
+
+        List<Post> result = postService.getAllPosts();
+
+        assertEquals(posts, result);
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/edu/bjtu/groupone/backend/UserControllerTest.java b/src/test/java/edu/bjtu/groupone/backend/UserControllerTest.java
deleted file mode 100644
index 73c99ae..0000000
--- a/src/test/java/edu/bjtu/groupone/backend/UserControllerTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package edu.bjtu.groupone.backend;
-
-import edu.bjtu.groupone.backend.api.UserController;
-import edu.bjtu.groupone.backend.domain.entity.Result;
-import edu.bjtu.groupone.backend.domain.entity.User;
-import edu.bjtu.groupone.backend.service.UserService;
-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 java.util.Arrays;
-import java.util.List;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.*;
-
-@ExtendWith(MockitoExtension.class)
-class UserControllerTest {
-
-    @Mock
-    private UserService userService;
-
-    @InjectMocks
-    private UserController userController;
-
-    private User testUser;
-
-    @BeforeEach
-    void setUp() {
-        testUser = new User();
-        testUser.setUserId(1);
-        testUser.setUsername("testuser");
-        testUser.setEmail("test@example.com");
-    }
-
-    @Test
-    void deleteUser_shouldReturnSuccess() {
-        // 调用
-        Result<String> result = userController.deleteUser(1);
-
-        // 验证：修改预期为英文 "success"
-        assertEquals(0, result.getCode());
-        assertEquals("success", result.getMsg());  // 修改这里
-        verify(userService, times(1)).deleteUser(1);
-    }
-
-    @Test
-    void updateUser_shouldReturnSuccess() {
-        // 调用
-        Result<String> result = userController.updateUser(1, testUser);
-
-        // 验证：修改预期为英文 "success"
-        assertEquals(0, result.getCode());
-        assertEquals("success", result.getMsg());  // 修改这里
-        verify(userService, times(1)).updateUser(any(User.class));
-    }
-
-    @Test
-    void getUser_shouldReturnUser() {
-        // 模拟
-        when(userService.getUserById(1)).thenReturn(testUser);
-
-        // 调用
-        Result<User> result = userController.getUser(1);
-
-        // 验证
-        assertEquals(0, result.getCode());
-        assertEquals(testUser, result.getData());
-        verify(userService, times(1)).getUserById(1);
-    }
-
-    @Test
-    void getAllUsers_shouldReturnUserList() {
-        // 模拟
-        List<User> users = Arrays.asList(testUser, new User());
-        when(userService.getAllUsers()).thenReturn(users);
-
-        // 调用
-        Result<List<User>> result = userController.getAllUsers();
-
-        // 验证
-        assertEquals(0, result.getCode());
-        assertEquals(2, result.getData().size());
-        verify(userService, times(1)).getAllUsers();
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/edu/bjtu/groupone/backend/UserServImplTest.java b/src/test/java/edu/bjtu/groupone/backend/UserServImplTest.java
index e877de8..8475680 100644
--- a/src/test/java/edu/bjtu/groupone/backend/UserServImplTest.java
+++ b/src/test/java/edu/bjtu/groupone/backend/UserServImplTest.java
@@ -3,6 +3,7 @@
 import edu.bjtu.groupone.backend.domain.entity.User;
 import edu.bjtu.groupone.backend.mapper.UserMapper;
 import edu.bjtu.groupone.backend.service.impl.UserServImpl;
+import edu.bjtu.groupone.backend.utils.EmailUtil;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -15,7 +16,6 @@
 
 import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.*;
 
 @ExtendWith(MockitoExtension.class)
@@ -26,15 +26,20 @@
 
     @InjectMocks
     private UserServImpl userService;
+    @Mock
+    private EmailUtil emailUtil;
 
     private User testUser;
-
+    private User user;
     @BeforeEach
     void setUp() {
         testUser = new User();
         testUser.setUserId(1);
         testUser.setUsername("testuser");
         testUser.setEmail("test@example.com");
+        user = new User();
+        user.setUserId(1);
+        user.setEmail("test@example.com");
     }
 
     @Test
@@ -87,4 +92,22 @@
         assertEquals(2, result.size());
         verify(userMapper, times(1)).selectAllUsers();
     }
+    @Test
+    void getRemainingTasks_Success() {
+        when(userMapper.selectUserById(1)).thenReturn(user);
+        when(userMapper.countRemainingTasks(1)).thenReturn(3);
+
+        int result = userService.getRemainingTasks(1);
+
+        assertEquals(3, result);
+    }
+
+    @Test
+    void getRemainingTasks_UserNotFound() {
+        when(userMapper.selectUserById(999)).thenReturn(null);
+
+        int result = userService.getRemainingTasks(999);
+
+        assertEquals(-1, result);
+    }
 }
\ No newline at end of file
diff --git a/src/test/java/edu/bjtu/groupone/backend/WorkControllerTest.java b/src/test/java/edu/bjtu/groupone/backend/WorkControllerTest.java
deleted file mode 100644
index 4c527c6..0000000
--- a/src/test/java/edu/bjtu/groupone/backend/WorkControllerTest.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package edu.bjtu.groupone.backend;
-
-import edu.bjtu.groupone.backend.api.WorkController;
-import edu.bjtu.groupone.backend.domain.dto.WorkResponse;
-import edu.bjtu.groupone.backend.domain.entity.Category;
-import edu.bjtu.groupone.backend.domain.entity.Work;
-import edu.bjtu.groupone.backend.service.WorkService;
-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.data.domain.Page;
-import org.springframework.data.domain.PageImpl;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.http.ResponseEntity;
-
-import java.util.Collections;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.*;
-
-@ExtendWith(MockitoExtension.class)
-class WorkControllerTest {
-
-    @Mock
-    private WorkService workService;
-
-    @InjectMocks
-    private WorkController workController;
-
-    private Work testWork;
-    private WorkResponse testResponse;
-
-    @BeforeEach
-    void setUp() {
-        testWork = new Work();
-        testWork.setId(1L);
-        testWork.setTitle("Test Work");
-        testWork.setAuthor("Test Author");
-        testWork.setViews(100);
-
-        // 创建 Category 对象
-        Category category = new Category();
-        category.setId(1L);
-        testWork.setCategory(category);
-
-        // 使用正确的参数创建 WorkResponse
-        testResponse = new WorkResponse(
-                1L,
-                "Test Work",
-                "Test Author",
-                100,
-                1L,
-                "Test Description", // 新增 description 参数
-                "2023-06-15"
-        );
-    }
-
-    @Test
-    void createWork_shouldReturnSuccess() {
-        // 调用
-        ResponseEntity<String> response = workController.createWork(testWork);
-
-        // 验证
-        assertEquals(200, response.getStatusCodeValue());
-        assertEquals("作品创建成功", response.getBody());
-        verify(workService, times(1)).addWork(any(Work.class));
-    }
-
-    @Test
-    void deleteWork_shouldReturnSuccess() {
-        // 调用
-        ResponseEntity<String> response = workController.deleteWork(1L);
-
-        // 验证
-        assertEquals(200, response.getStatusCodeValue());
-        assertEquals("作品删除成功", response.getBody());
-        verify(workService, times(1)).deleteWork(1L);
-    }
-
-    @Test
-    void updateWork_shouldReturnSuccess() {
-        // 调用
-        ResponseEntity<String> response = workController.updateWork(1L, testWork);
-
-        // 验证
-        assertEquals(200, response.getStatusCodeValue());
-        assertEquals("作品更新成功", response.getBody());
-        verify(workService, times(1)).updateWork(any(Work.class));
-    }
-
-    @Test
-    void getWork_shouldReturnWork() {
-        // 模拟
-        when(workService.getWorkById(1L)).thenReturn(testWork);
-
-        // 调用
-        ResponseEntity<Work> response = workController.getWork(1L);
-
-        // 验证
-        assertEquals(200, response.getStatusCodeValue());
-        assertEquals(testWork, response.getBody());
-        verify(workService, times(1)).getWorkById(1L);
-    }
-
-    @Test
-    void getWorks_shouldReturnPage() {
-        // 创建模拟分页数据
-        Page<WorkResponse> mockPage = new PageImpl<>(
-                Collections.singletonList(testResponse),
-                PageRequest.of(0, 10),
-                1
-        );
-
-        // 模拟服务层方法
-        when(workService.getWorks(eq(null), eq(1), eq(10)))
-                .thenReturn(mockPage);
-
-        // 调用
-        ResponseEntity<Page<WorkResponse>> response = workController.getWorks(null, 1, 10);
-
-        // 验证
-        assertEquals(200, response.getStatusCodeValue());
-        assertNotNull(response.getBody());
-        assertEquals(1, response.getBody().getTotalElements());
-        assertEquals(1, response.getBody().getContent().size());
-        assertEquals("Test Work", response.getBody().getContent().get(0).getTitle());
-        verify(workService, times(1)).getWorks(null, 1, 10);
-    }
-}
\ No newline at end of file
diff --git a/src/test/java/edu/bjtu/groupone/backend/WorkServiceTest.java b/src/test/java/edu/bjtu/groupone/backend/WorkServiceTest.java
index 5277d54..b3871da 100644
--- a/src/test/java/edu/bjtu/groupone/backend/WorkServiceTest.java
+++ b/src/test/java/edu/bjtu/groupone/backend/WorkServiceTest.java
@@ -15,31 +15,29 @@
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Pageable;
 
 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.anyList;
+import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
 @ExtendWith(MockitoExtension.class)
 class WorkServiceTest {
 
     @Mock
-    private WorkMybatisMapper mapper;
+    private WorkMybatisMapper workMybatisMapper;
 
     @Mock
     private CategoryService categoryService;
 
     @InjectMocks
-    private WorkService service;
+    private WorkService workService;
 
     private Work testWork;
     private Category testCategory;
+    private List<Work> works;
 
     @BeforeEach
     void setUp() {
@@ -52,61 +50,71 @@
                 .views(100)
                 .category(testCategory)
                 .build();
+
+        Category category = new Category(1L, "文学艺术", null);
+        works = Arrays.asList(
+                new Work(1L, "《我的世界》", "张三", 1234, category, "一部关于...", "2023-06-15"),
+                new Work(2L, "《你的世界》", "张三", 567, category, "另一部关于...", "2023-06-16")
+        );
     }
 
     @Test
     void addWork_shouldCallMapper() {
-        // 调用
-        service.addWork(testWork);
-
-        // 验证
-        verify(mapper, times(1)).save(testWork);
+        workService.addWork(testWork);
+        verify(workMybatisMapper, times(1)).save(testWork);
     }
 
     @Test
     void deleteWork_shouldCallMapper() {
-        // 调用
-        service.deleteWork(1L);
-
-        // 验证
-        verify(mapper, times(1)).deleteById(1L);
+        workService.deleteWork(1L);
+        verify(workMybatisMapper, times(1)).deleteById(1L);
     }
 
     @Test
     void updateWork_shouldCallMapper() {
-        // 调用
-        service.updateWork(testWork);
-
-        // 验证
-        verify(mapper, times(1)).update(testWork);
+        workService.updateWork(testWork);
+        verify(workMybatisMapper, times(1)).update(testWork);
     }
 
     @Test
     void getWorkById_shouldReturnWork() {
-        // 模拟
-        when(mapper.findById(1L)).thenReturn(testWork);
-
-        // 调用
-        Work result = service.getWorkById(1L);
-
-        // 验证
+        when(workMybatisMapper.findById(1L)).thenReturn(testWork);
+        Work result = workService.getWorkById(1L);
         assertEquals(testWork, result);
-        verify(mapper, times(1)).findById(1L);
+        verify(workMybatisMapper, times(1)).findById(1L);
     }
 
     @Test
     void getWorks_shouldReturnPage() {
-        // 模拟
-        Page<Work> workPage = new PageImpl<>(Collections.singletonList(testWork));
-        when(categoryService.getAllSubcategoryIds(1L)).thenReturn(Arrays.asList(1L, 2L));
-        when(mapper.findByCategoryIdIn(anyList(), any(Pageable.class))).thenReturn(workPage);
+        Long categoryId = 1L;
+        int page = 1; // Fix: Use page = 1 to account for WorkService expecting 1-based indexing
+        int size = 10;
+        List<Long> categoryIds = Arrays.asList(1L);
 
-        // 调用
-        Page<WorkResponse> result = service.getWorks(1L, 1, 10);
+        when(categoryService.getAllSubcategoryIds(categoryId)).thenReturn(categoryIds);
+        Page<Work> workPage = new PageImpl<>(Arrays.asList(testWork));
+        when(workMybatisMapper.findByCategoryIdIn(categoryIds, PageRequest.of(0, size))).thenReturn(workPage);
 
-        // 验证
-        assertEquals(1, result.getTotalElements());
-        assertEquals("Test Work", result.getContent().get(0).getTitle());
-        verify(mapper, times(1)).findByCategoryIdIn(anyList(), any(Pageable.class));
+        Page<WorkResponse> result = workService.getWorks(categoryId, page, size);
+
+        assertEquals(1, result.getContent().size());
+        verify(categoryService, times(1)).getAllSubcategoryIds(categoryId);
+        verify(workMybatisMapper, times(1)).findByCategoryIdIn(categoryIds, PageRequest.of(0, size));
+    }
+
+    @Test
+    void getWorksByAuthor_Success() {
+        when(workMybatisMapper.findByAuthor("张三")).thenReturn(works);
+        List<WorkResponse> result = workService.getWorksByAuthor("张三");
+        assertEquals(2, result.size());
+        assertEquals("《我的世界》", result.get(0).getTitle());
+        assertEquals("《你的世界》", result.get(1).getTitle());
+    }
+
+    @Test
+    void getWorksByAuthor_Empty() {
+        when(workMybatisMapper.findByAuthor(anyString())).thenReturn(List.of());
+        List<WorkResponse> result = workService.getWorksByAuthor("李四");
+        assertTrue(result.isEmpty());
     }
 }
\ No newline at end of file
