用户,分区,作品的增删改查,根据作者查所有作品的接口,根据用户查还有多少任务没做,帖子和评论的增删改查,并优化了测试文件的结构

Change-Id: I4266495b6465fcbdf5705f02a59d2ae9fa54cbda
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
diff --git a/src/test/resources/application-test.properties b/src/test/resources/application-test.properties
index b216159..a390de5 100644
--- a/src/test/resources/application-test.properties
+++ b/src/test/resources/application-test.properties
@@ -2,7 +2,7 @@
 spring.datasource.driver-class-name=org.h2.Driver
 spring.datasource.username=sa
 spring.datasource.password=
-spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
-spring.jpa.hibernate.ddl-auto=create-drop
 spring.h2.console.enabled=true
-spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
\ No newline at end of file
+spring.sql.init.mode=always
+spring.sql.init.schema-locations=classpath:schema.sql
+spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
\ No newline at end of file