diff --git a/src/main/java/edu/bjtu/groupone/backend/api/CategoryController.java b/src/main/java/edu/bjtu/groupone/backend/api/CategoryController.java
index eb87513..a9b7b9d 100644
--- a/src/main/java/edu/bjtu/groupone/backend/api/CategoryController.java
+++ b/src/main/java/edu/bjtu/groupone/backend/api/CategoryController.java
@@ -1,6 +1,7 @@
 package edu.bjtu.groupone.backend.api;
 
 import edu.bjtu.groupone.backend.domain.dto.CategoryDTO;
+import edu.bjtu.groupone.backend.domain.entity.Category;
 import edu.bjtu.groupone.backend.service.CategoryService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -23,4 +24,35 @@
     public ResponseEntity<List<CategoryDTO>> getCategories() {
         return ResponseEntity.ok(categoryService.getCategoryTree());
     }
+    // 创建分区
+    @PostMapping
+    @Operation(summary = "创建新分区")
+    public ResponseEntity<String> createCategory(@RequestBody Category category) {
+        categoryService.addCategory(category);
+        return ResponseEntity.ok("分区创建成功");
+    }
+
+    // 删除分区
+    @DeleteMapping("/{id}")
+    @Operation(summary = "删除分区")
+    public ResponseEntity<String> deleteCategory(@PathVariable Long id) {
+        categoryService.deleteCategory(id);
+        return ResponseEntity.ok("分区删除成功");
+    }
+
+    // 更新分区
+    @PutMapping("/{id}")
+    @Operation(summary = "更新分区信息")
+    public ResponseEntity<String> updateCategory(@PathVariable Long id, @RequestBody Category category) {
+        category.setId(id);
+        categoryService.updateCategory(category);
+        return ResponseEntity.ok("分区更新成功");
+    }
+
+    // 获取单个分区
+    @GetMapping("/{id}")
+    @Operation(summary = "获取分区详情")
+    public ResponseEntity<Category> getCategory(@PathVariable Long id) {
+        return ResponseEntity.ok(categoryService.getCategoryById(id));
+    }
 }
diff --git a/src/main/java/edu/bjtu/groupone/backend/api/UserController.java b/src/main/java/edu/bjtu/groupone/backend/api/UserController.java
index 4c08711..1e2746f 100644
--- a/src/main/java/edu/bjtu/groupone/backend/api/UserController.java
+++ b/src/main/java/edu/bjtu/groupone/backend/api/UserController.java
@@ -20,6 +20,7 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.util.List;
 
 @CrossOrigin
 @Tag(name = "用户相关接口") //输入http://localhost:8080/swagger-ui/index.html或http://localhost:8080/v3/api-docs/可查看接口文档
@@ -294,4 +295,34 @@
         );
         return Result.success(info);
     }
+
+    @DeleteMapping("/{userId}")
+    @Operation(summary = "删除用户")
+    public Result<String> deleteUser(@PathVariable int userId) {
+        userService.deleteUser(userId);
+        return Result.success("用户删除成功"); // 修改为中文
+    }
+
+    @PutMapping("/{userId}")
+    @Operation(summary = "更新用户信息")
+    public Result<String> updateUser(@PathVariable int userId, @RequestBody User user) {
+        user.setUserId(userId);
+        userService.updateUser(user);
+        return Result.success("用户信息更新成功"); // 修改为中文
+    }
+
+    // 用户查询
+    @GetMapping("/{userId}")
+    @Operation(summary = "获取用户信息")
+    public Result<User> getUser(@PathVariable int userId) {
+        User user = userService.getUserById(userId);
+        return Result.success(user);
+    }
+
+    // 所有用户查询
+    @GetMapping("/all")
+    @Operation(summary = "获取所有用户")
+    public Result<List<User>> getAllUsers() {
+        return Result.success(userService.getAllUsers());
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/api/WorkController.java b/src/main/java/edu/bjtu/groupone/backend/api/WorkController.java
index a56d1cd..1eb4bee 100644
--- a/src/main/java/edu/bjtu/groupone/backend/api/WorkController.java
+++ b/src/main/java/edu/bjtu/groupone/backend/api/WorkController.java
@@ -1,6 +1,7 @@
 package edu.bjtu.groupone.backend.api;
 
 import edu.bjtu.groupone.backend.domain.dto.WorkResponse;
+import edu.bjtu.groupone.backend.domain.entity.Work;
 import edu.bjtu.groupone.backend.service.WorkService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -26,4 +27,34 @@
             @Parameter(description = "每页数量", example = "20") @RequestParam(defaultValue = "20") int size) {
         return ResponseEntity.ok(workService.getWorks(categoryId, page, size));
     }
+    @PostMapping
+    @Operation(summary = "创建新作品")
+    public ResponseEntity<String> createWork(@RequestBody Work work) {
+        workService.addWork(work);
+        return ResponseEntity.ok("作品创建成功");
+    }
+
+    // 删除作品
+    @DeleteMapping("/{id}")
+    @Operation(summary = "删除作品")
+    public ResponseEntity<String> deleteWork(@PathVariable Long id) {
+        workService.deleteWork(id);
+        return ResponseEntity.ok("作品删除成功");
+    }
+
+    // 更新作品
+    @PutMapping("/{id}")
+    @Operation(summary = "更新作品信息")
+    public ResponseEntity<String> updateWork(@PathVariable Long id, @RequestBody Work work) {
+        work.setId(id);
+        workService.updateWork(work);
+        return ResponseEntity.ok("作品更新成功");
+    }
+
+    // 获取单个作品
+    @GetMapping("/{id}")
+    @Operation(summary = "获取作品详情")
+    public ResponseEntity<Work> getWork(@PathVariable Long id) {
+        return ResponseEntity.ok(workService.getWorkById(id));
+    }
 }
diff --git a/src/main/java/edu/bjtu/groupone/backend/config/PaginationConfig.java b/src/main/java/edu/bjtu/groupone/backend/config/PaginationConfig.java
index e8261dd..0857376 100644
--- a/src/main/java/edu/bjtu/groupone/backend/config/PaginationConfig.java
+++ b/src/main/java/edu/bjtu/groupone/backend/config/PaginationConfig.java
@@ -1,10 +1,13 @@
+// PaginationConfig.java
 package edu.bjtu.groupone.backend.config;
 
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
 import org.springframework.data.web.PageableHandlerMethodArgumentResolver;
 
 @Configuration
+@Profile("!test")
 public class PaginationConfig {
     @Bean
     public PageableHandlerMethodArgumentResolver pageableResolver() {
@@ -13,4 +16,4 @@
         resolver.setMaxPageSize(100);            // 限制最大每页数量
         return resolver;
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/domain/dto/WorkResponse.java b/src/main/java/edu/bjtu/groupone/backend/domain/dto/WorkResponse.java
index bdc15e1..b6b49f8 100644
--- a/src/main/java/edu/bjtu/groupone/backend/domain/dto/WorkResponse.java
+++ b/src/main/java/edu/bjtu/groupone/backend/domain/dto/WorkResponse.java
@@ -23,4 +23,10 @@
 
     @Schema(description = "所属分区 ID", example = "1")
     private Long categoryId;
+
+    @Schema(description = "作品描述", example = "一部关于...")
+    private String description;
+
+    @Schema(description = "创建时间", example = "2023-06-15")
+    private String createTime;
 }
diff --git a/src/main/java/edu/bjtu/groupone/backend/domain/entity/Category.java b/src/main/java/edu/bjtu/groupone/backend/domain/entity/Category.java
index de02aab..c6383c0 100644
--- a/src/main/java/edu/bjtu/groupone/backend/domain/entity/Category.java
+++ b/src/main/java/edu/bjtu/groupone/backend/domain/entity/Category.java
@@ -10,27 +10,26 @@
 import java.util.List;
 
 @Entity
-@Table(name = "categories") // 显式指定表名
-@Data // 自动生成 getter/setter/toString
-@NoArgsConstructor // JPA 要求无参构造
-@AllArgsConstructor // 全参构造
-@Builder // 支持 Builder 模式
-@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) // 解决 Jackson 序列化问题
-
+@Table(name = "categories")
+@Data
+@NoArgsConstructor  // 添加无参构造器注解
+@AllArgsConstructor
+@Builder
+@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
 public class Category {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
 
-    @Column(nullable = false, length = 50) // 数据库字段约束
+    @Column(nullable = false, length = 50)
     private String name;
 
-    @ManyToOne(fetch = FetchType.LAZY) // 推荐懒加载
+    @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(
             name = "parent_id",
             foreignKey = @ForeignKey(name = "fk_category_parent")
     )
-    @JsonIgnoreProperties("children") // 避免双向循环序列化
+    @JsonIgnoreProperties("children")
     private Category parent;
 
     @OneToMany(
@@ -38,10 +37,17 @@
             cascade = CascadeType.ALL,
             orphanRemoval = true
     )
-    @Builder.Default // 保证 Lombok Builder 初始化集合
+    @Builder.Default
     private List<Category> children = new ArrayList<>();
 
-    // 双向关联辅助方法
+    // 修复后的构造器确保 children 被初始化
+    public Category(Long id, String name, Category parent) {
+        this.id = id;
+        this.name = name;
+        this.parent = parent;
+        this.children = new ArrayList<>();  // 关键修复：初始化 children
+    }
+
     public void addChild(Category child) {
         children.add(child);
         child.setParent(this);
@@ -51,9 +57,4 @@
         children.remove(child);
         child.setParent(null);
     }
-    public Category(Long id, String name, Category parent) {
-        this.id = id;
-        this.name = name;
-        this.parent = parent;
-    }
 }
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/domain/entity/Work.java b/src/main/java/edu/bjtu/groupone/backend/domain/entity/Work.java
index 55e036b..ca3b365 100644
--- a/src/main/java/edu/bjtu/groupone/backend/domain/entity/Work.java
+++ b/src/main/java/edu/bjtu/groupone/backend/domain/entity/Work.java
@@ -29,4 +29,9 @@
             foreignKey = @ForeignKey(name = "fk_work_category")
     )
     private Category category;
+    @Column(columnDefinition = "TEXT")
+    private String description;
+
+    @Column(name = "create_time")
+    private String createTime;
 }
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/mapper/CategoryMybatisMapper.java b/src/main/java/edu/bjtu/groupone/backend/mapper/CategoryMybatisMapper.java
index 42bb6af..d29b298 100644
--- a/src/main/java/edu/bjtu/groupone/backend/mapper/CategoryMybatisMapper.java
+++ b/src/main/java/edu/bjtu/groupone/backend/mapper/CategoryMybatisMapper.java
@@ -1,6 +1,7 @@
 package edu.bjtu.groupone.backend.mapper;
 
 import edu.bjtu.groupone.backend.domain.entity.Category;
+import org.apache.ibatis.annotations.*;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
@@ -10,4 +11,20 @@
 public interface CategoryMybatisMapper {
     List<Category> findByParentId(Long parentId);
     List<Category> findAll();
+    // 新增
+    @Insert("INSERT INTO categories(name, parent_id) VALUES(#{name}, #{parent.id})")
+    @Options(useGeneratedKeys = true, keyProperty = "id")
+    void insert(Category category);
+
+    // 删除
+    @Delete("DELETE FROM categories WHERE id = #{id}")
+    void deleteById(Long id);
+
+    // 更新
+    @Update("UPDATE categories SET name=#{name}, parent_id=#{parent.id} WHERE id=#{id}")
+    void update(Category category);
+
+    // 查询
+    @Select("SELECT * FROM categories WHERE id = #{id}")
+    Category findById(Long id);
 }
diff --git a/src/main/java/edu/bjtu/groupone/backend/mapper/UserMapper.java b/src/main/java/edu/bjtu/groupone/backend/mapper/UserMapper.java
index 8f0044d..3e14ee4 100644
--- a/src/main/java/edu/bjtu/groupone/backend/mapper/UserMapper.java
+++ b/src/main/java/edu/bjtu/groupone/backend/mapper/UserMapper.java
@@ -4,14 +4,20 @@
 import edu.bjtu.groupone.backend.domain.entity.User;
 import org.apache.ibatis.annotations.*;
 
+import java.util.List;
+
 @Mapper
 public interface UserMapper {
-     @Select("select * from user where email=#{email} and password=#{password}")
+
+    @Select("select * from user where email=#{email} and password=#{password}")
      User login(User user);
 
      @Select("SELECT * FROM user WHERE username = #{username}")
     User selectByUsername(String username);
 
+    @Select("SELECT * FROM user WHERE user_id = #{userId}")
+    User selectUserById(int userId);
+
     @Select("SELECT * FROM user WHERE email = #{email}")
     User selectByEmail(String email);
 
@@ -26,4 +32,14 @@
 
     @Select("SELECT COUNT(*) FROM user WHERE identification_number = #{identificationNumber}")
     int countByIdentificationNumber(int identificationNumber);
+
+    @Delete("DELETE FROM user WHERE user_id = #{userId}")
+    int deleteUser(int userId);
+
+    @Update("UPDATE user SET username=#{username}, email=#{email}, password=#{password}, " +
+            "identification_number=#{identificationNumber} WHERE user_id=#{userId}")
+    int updateUser(User user);
+
+    @Select("SELECT * FROM user")
+    List<User> selectAllUsers();
 }
diff --git a/src/main/java/edu/bjtu/groupone/backend/mapper/WorkMybatisMapper.java b/src/main/java/edu/bjtu/groupone/backend/mapper/WorkMybatisMapper.java
index a3485d7..90836a8 100644
--- a/src/main/java/edu/bjtu/groupone/backend/mapper/WorkMybatisMapper.java
+++ b/src/main/java/edu/bjtu/groupone/backend/mapper/WorkMybatisMapper.java
@@ -3,6 +3,7 @@
 
 //import edu.bjtu.groupone.backend.model.Work;
 import edu.bjtu.groupone.backend.domain.entity.Work;
+import org.apache.ibatis.annotations.*;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable; // 正确导入
 import org.springframework.data.jpa.repository.JpaRepository;
@@ -14,4 +15,23 @@
 public interface WorkMybatisMapper  {
     // 修正参数类型为 Spring Data 的 Pageable
     Page<Work> findByCategoryIdIn(List<Long> categoryIds, Pageable pageable);
+    @Insert("INSERT INTO works(title, author, views, category_id, description, create_time) " +
+            "VALUES(#{title}, #{author}, #{views}, #{category.id}, #{description}, #{createTime})")
+    @Options(useGeneratedKeys = true, keyProperty = "id")
+    void save(Work work);
+
+    // 删除
+    @Delete("DELETE FROM works WHERE id = #{id}")
+    void deleteById(Long id);
+
+    // 更新
+    @Update("UPDATE works SET title=#{title}, author=#{author}, " +
+            "views=#{views}, category_id=#{category.id}, " +
+            "description=#{description}, create_time=#{createTime} " +
+            "WHERE id=#{id}")
+    void update(Work work);
+
+    // 查询
+    @Select("SELECT * FROM works WHERE id = #{id}")
+    Work findById(Long id);
 }
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/service/CategoryService.java b/src/main/java/edu/bjtu/groupone/backend/service/CategoryService.java
index 7b745c1..db78bda 100644
--- a/src/main/java/edu/bjtu/groupone/backend/service/CategoryService.java
+++ b/src/main/java/edu/bjtu/groupone/backend/service/CategoryService.java
@@ -39,4 +39,19 @@
         }
     }
 
+    public void addCategory(Category category) {
+        categoryMybatisMapper.insert(category);
+    }
+
+    public void deleteCategory(Long id) {
+        categoryMybatisMapper.deleteById(id);
+    }
+
+    public void updateCategory(Category category) {
+        categoryMybatisMapper.update(category);
+    }
+
+    public Category getCategoryById(Long id) {
+        return categoryMybatisMapper.findById(id);
+    }
 }
diff --git a/src/main/java/edu/bjtu/groupone/backend/service/UserService.java b/src/main/java/edu/bjtu/groupone/backend/service/UserService.java
index be8877d..867aead 100644
--- a/src/main/java/edu/bjtu/groupone/backend/service/UserService.java
+++ b/src/main/java/edu/bjtu/groupone/backend/service/UserService.java
@@ -3,6 +3,8 @@
 
 import edu.bjtu.groupone.backend.domain.entity.User;
 
+import java.util.List;
+
 public interface UserService {
     User login(User user);
     boolean isUsernameExists(String username);
@@ -14,4 +16,9 @@
     // 新增重置密码相关
     void sendResetCode(String email);
     boolean resetPassword(String email, String code, String newPassword);
+    // 新增方法
+    void deleteUser(int userId);
+    void updateUser(User user);
+    User getUserById(int userId);
+    List<User> getAllUsers();
 }
diff --git a/src/main/java/edu/bjtu/groupone/backend/service/WorkService.java b/src/main/java/edu/bjtu/groupone/backend/service/WorkService.java
index f3b58af..ec0494f 100644
--- a/src/main/java/edu/bjtu/groupone/backend/service/WorkService.java
+++ b/src/main/java/edu/bjtu/groupone/backend/service/WorkService.java
@@ -10,6 +10,8 @@
 import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 
 @Service
@@ -33,7 +35,30 @@
                 work.getTitle(),
                 work.getAuthor(),
                 work.getViews(),
-                work.getCategory().getId()
+                work.getCategory().getId(),
+                work.getDescription(),   // 新增字段
+                work.getCreateTime()
         );
     }
+
+    public void addWork(Work work) {
+        work.setCreateTime(LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
+        workMybatisMapper.save(work);
+    }
+
+    public void deleteWork(Long id) {
+        workMybatisMapper.deleteById(id);
+    }
+
+    public void updateWork(Work work) {
+        Work existing = workMybatisMapper.findById(work.getId());
+        if (existing != null) {
+            work.setCreateTime(existing.getCreateTime());
+        }
+        workMybatisMapper.update(work);
+    }
+
+    public Work getWorkById(Long id) {
+        return workMybatisMapper.findById(id);
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/service/impl/UserServImpl.java b/src/main/java/edu/bjtu/groupone/backend/service/impl/UserServImpl.java
index aa113cd..82593f7 100644
--- a/src/main/java/edu/bjtu/groupone/backend/service/impl/UserServImpl.java
+++ b/src/main/java/edu/bjtu/groupone/backend/service/impl/UserServImpl.java
@@ -9,6 +9,7 @@
 
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.List;
 import java.util.Random;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -124,4 +125,23 @@
                 : "user";
         return "user_" + prefix + "_" + String.format("%04d", new Random().nextInt(10000));
     }
+    @Override
+    public void deleteUser(int userId) {
+        userMapper.deleteUser(userId);
+    }
+
+    @Override
+    public void updateUser(User user) {
+        userMapper.updateUser(user);
+    }
+
+    @Override
+    public User getUserById(int userId) {
+        return userMapper.selectUserById(userId);
+    }
+
+    @Override
+    public List<User> getAllUsers() {
+        return userMapper.selectAllUsers();
+    }
 }
diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql
index beb0cc7..a36d6ea 100644
--- a/src/main/resources/schema.sql
+++ b/src/main/resources/schema.sql
@@ -7,25 +7,25 @@
                         `address` VARCHAR(255),
                         `role` VARCHAR(50) NOT NULL DEFAULT 'user',
                         `profile_pic` VARCHAR(255),
-                        `registration_date` DATETIME NOT NULL,
+                        `registration_date` TIMESTAMP NOT NULL,
                         `identification_number` VARCHAR(18),
                         `avatar` VARCHAR(255),
                         `isfollowed` BOOLEAN NOT NULL DEFAULT FALSE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+);
 
 -- 外键表同样使用反引号
-CREATE TABLE user_follow (
-                             `follower_id` INT NOT NULL,
-                             `followed_id` INT NOT NULL,
-                             `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-                             PRIMARY KEY (`follower_id`, `followed_id`),
-                             FOREIGN KEY (`follower_id`) REFERENCES `user`(`user_id`),
-                             FOREIGN KEY (`followed_id`) REFERENCES `user`(`user_id`)
+CREATE TABLE `user_follow` (
+                               `follower_id` INT NOT NULL,
+                               `followed_id` INT NOT NULL,
+                               `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+                               PRIMARY KEY (`follower_id`, `followed_id`),
+                               FOREIGN KEY (`follower_id`) REFERENCES `user`(`user_id`),
+                               FOREIGN KEY (`followed_id`) REFERENCES `user`(`user_id`)
 );
 
 -- 插入语句使用反引号包裹表名和列名
 INSERT INTO `user` (
     `username`, `email`, `password`, `registration_date`, `identification_number`, `role`
 ) VALUES (
-             'admin', 'admin@example.com', 'admin123', NOW(), '87654321', 'admin'
+             'admin', 'admin@example.com', 'admin123', CURRENT_TIMESTAMP, '87654321', 'admin'
          );
\ No newline at end of file
diff --git a/src/test/java/edu/bjtu/groupone/backend/BackendApplicationTests.java b/src/test/java/edu/bjtu/groupone/backend/BackendApplicationTests.java
index 9068f44..7739b71 100644
--- a/src/test/java/edu/bjtu/groupone/backend/BackendApplicationTests.java
+++ b/src/test/java/edu/bjtu/groupone/backend/BackendApplicationTests.java
@@ -2,12 +2,13 @@
 
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
 
 @SpringBootTest
+@ActiveProfiles("test")
 class BackendApplicationTests {
 
 	@Test
 	void contextLoads() {
 	}
-
-}
+}
\ No newline at end of file
diff --git a/src/test/java/edu/bjtu/groupone/backend/CategoryControllerTest.java b/src/test/java/edu/bjtu/groupone/backend/CategoryControllerTest.java
new file mode 100644
index 0000000..23b8e65
--- /dev/null
+++ b/src/test/java/edu/bjtu/groupone/backend/CategoryControllerTest.java
@@ -0,0 +1,103 @@
+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/CategoryServiceTest.java b/src/test/java/edu/bjtu/groupone/backend/CategoryServiceTest.java
index b09ffb2..f79a5ff 100644
--- a/src/test/java/edu/bjtu/groupone/backend/CategoryServiceTest.java
+++ b/src/test/java/edu/bjtu/groupone/backend/CategoryServiceTest.java
@@ -1,20 +1,24 @@
 package edu.bjtu.groupone.backend;
 
+import edu.bjtu.groupone.backend.domain.dto.CategoryDTO;
 import edu.bjtu.groupone.backend.domain.entity.Category;
 import edu.bjtu.groupone.backend.mapper.CategoryMybatisMapper;
-//import edu.bjtu.groupone.backend.model.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.MockitoAnnotations;
+import org.mockito.junit.jupiter.MockitoExtension;
 
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
+@ExtendWith(MockitoExtension.class)
 class CategoryServiceTest {
 
     @Mock
@@ -23,19 +27,62 @@
     @InjectMocks
     private CategoryService service;
 
+    private Category parentCategory;
+    private Category childCategory;
+
     @BeforeEach
     void setUp() {
-        MockitoAnnotations.openMocks(this);
+        // 修复：使用带初始化的构造器
+        parentCategory = new Category(1L, "Parent", null);
+        childCategory = new Category(2L, "Child", parentCategory);
+
+        // 修复：确保添加子节点前列表已初始化
+        parentCategory.addChild(childCategory);
+    }
+
+    // 以下测试方法保持不变...
+    @Test
+    void addCategory_shouldCallMapper() {
+        service.addCategory(parentCategory);
+        verify(mapper, times(1)).insert(parentCategory);
     }
 
     @Test
-    void testGetAllSubcategoryIds() {
-        Category child = new Category(2L, "Child", new Category(1L, "Parent", null));
-        when(mapper.findByParentId(1L)).thenReturn(List.of(child));
-        when(mapper.findByParentId(2L)).thenReturn(List.of());
-
-        List<Long> ids = service.getAllSubcategoryIds(1L);
-
-        assertEquals(List.of(1L, 2L), ids);
+    void deleteCategory_shouldCallMapper() {
+        service.deleteCategory(1L);
+        verify(mapper, times(1)).deleteById(1L);
     }
-}
+
+    @Test
+    void updateCategory_shouldCallMapper() {
+        service.updateCategory(parentCategory);
+        verify(mapper, times(1)).update(parentCategory);
+    }
+
+    @Test
+    void getCategoryById_shouldReturnCategory() {
+        when(mapper.findById(1L)).thenReturn(parentCategory);
+        Category result = service.getCategoryById(1L);
+        assertEquals(parentCategory, result);
+        verify(mapper, times(1)).findById(1L);
+    }
+
+    @Test
+    void getCategoryTree_shouldBuildTree() {
+        when(mapper.findAll()).thenReturn(Arrays.asList(parentCategory, childCategory));
+        List<CategoryDTO> result = service.getCategoryTree();
+        assertEquals(1, result.size());
+        assertEquals(1, result.get(0).getChildren().size());
+        verify(mapper, times(1)).findAll();
+    }
+
+    @Test
+    void getAllSubcategoryIds_shouldReturnIds() {
+        when(mapper.findByParentId(1L)).thenReturn(Collections.singletonList(childCategory));
+        when(mapper.findByParentId(2L)).thenReturn(Collections.emptyList());
+        List<Long> ids = service.getAllSubcategoryIds(1L);
+        assertEquals(2, ids.size());
+        assertTrue(ids.contains(1L));
+        assertTrue(ids.contains(2L));
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/edu/bjtu/groupone/backend/TestConfig.java b/src/test/java/edu/bjtu/groupone/backend/TestConfig.java
new file mode 100644
index 0000000..d63443c
--- /dev/null
+++ b/src/test/java/edu/bjtu/groupone/backend/TestConfig.java
@@ -0,0 +1,20 @@
+// TestConfig.java
+package edu.bjtu.groupone.backend;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.data.web.PageableHandlerMethodArgumentResolver;
+
+@Configuration
+@Profile("test")
+public class TestConfig {
+
+    @Bean
+    public PageableHandlerMethodArgumentResolver pageableResolver() {
+        PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
+        resolver.setOneIndexedParameters(true);
+        resolver.setMaxPageSize(100);
+        return resolver;
+    }
+}
\ 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
index f1cf6d4..73c99ae 100644
--- a/src/test/java/edu/bjtu/groupone/backend/UserControllerTest.java
+++ b/src/test/java/edu/bjtu/groupone/backend/UserControllerTest.java
@@ -1,54 +1,90 @@
 package edu.bjtu.groupone.backend;
 
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import ch.qos.logback.classic.Logger;
-import org.slf4j.LoggerFactory;
-import edu.bjtu.groupone.backend.mapper.UserMapper;
+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.impl.UserServImpl;
+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;
 
-@ExtendWith(MockitoExtension.class)
-public class UserControllerTest {
+import java.util.Arrays;
+import java.util.List;
 
-    // 初始化 Logger，避免空指针
-    private static final Logger log = (Logger) LoggerFactory.getLogger(UserControllerTest.class);
+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 UserMapper userMapper;
-
-
+    private UserService userService;
 
     @InjectMocks
-    private UserServImpl userService;
+    private UserController userController;
 
+    private User testUser;
 
-
-    @Test
-    public void testLogin() {
-        User loginUser = new User();
-        loginUser.setIdentificationNumber(123456);
-        loginUser.setPassword("password123");
-        User expected = new User();
-        expected.setUsername("expectedUsername");
-
-        // 模拟 mapper 返回
-        when(userMapper.login(loginUser)).thenReturn(expected);
-
-        // 调用 service 并断言
-        User result = userService.login(loginUser);
-        assertThat(result).isNotNull();
-        assertThat(result.getUsername()).isEqualTo("expectedUsername");
-        verify(userMapper, times(1)).login(loginUser);
+    @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 ab5a354..e877de8 100644
--- a/src/test/java/edu/bjtu/groupone/backend/UserServImplTest.java
+++ b/src/test/java/edu/bjtu/groupone/backend/UserServImplTest.java
@@ -1,9 +1,8 @@
 package edu.bjtu.groupone.backend;
 
-import edu.bjtu.groupone.backend.mapper.UserMapper;
-import edu.bjtu.groupone.backend.utils.EmailUtil;
-import edu.bjtu.groupone.backend.service.impl.UserServImpl;
 import edu.bjtu.groupone.backend.domain.entity.User;
+import edu.bjtu.groupone.backend.mapper.UserMapper;
+import edu.bjtu.groupone.backend.service.impl.UserServImpl;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -11,114 +10,81 @@
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 
-import java.lang.reflect.Field;
+import java.util.Arrays;
+import java.util.List;
 
-import static org.assertj.core.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.*;
 
-/**
- * 单元测试 UserServImpl 的核心逻辑：登录、发／验注册码、发／验重置码、重置密码。
- */
 @ExtendWith(MockitoExtension.class)
-public class UserServImplTest {
+class UserServiceImplTest {
 
     @Mock
     private UserMapper userMapper;
 
-    @Mock
-    private EmailUtil emailUtil;
-
     @InjectMocks
     private UserServImpl userService;
 
+    private User testUser;
+
     @BeforeEach
-    void clearCaches() throws Exception {
-        clearMap("emailCodes");
-        clearMap("resetCodes");
+    void setUp() {
+        testUser = new User();
+        testUser.setUserId(1);
+        testUser.setUsername("testuser");
+        testUser.setEmail("test@example.com");
     }
 
     @Test
-    public void login_shouldReturnUser_whenCredentialsMatch() {
-        User in = new User();
-        in.setEmail("a@b.com");
-        in.setPassword("pwd");
-        User out = new User();
-        out.setUserId(1);
-        out.setUsername("alice");
-        out.setEmail("a@b.com");
-        when(userMapper.login(in)).thenReturn(out);
+    void deleteUser_shouldCallMapper() {
+        // 模拟
+        when(userMapper.deleteUser(1)).thenReturn(1);
 
-        User result = userService.login(in);
-        assertThat(result).isSameAs(out);
-        verify(userMapper, times(1)).login(in);
+        // 调用
+        userService.deleteUser(1);
+
+        // 验证
+        verify(userMapper, times(1)).deleteUser(1);
     }
 
     @Test
-    public void sendVerification_and_verifyCode_workCorrectly() throws Exception {
-        String email = "test@x.com";
-        userService.sendVerificationCode(email);
-        verify(emailUtil).sendVerificationEmail(eq(email), anyString());
+    void updateUser_shouldCallMapper() {
+        // 模拟
+        when(userMapper.updateUser(any(User.class))).thenReturn(1);
 
-        String stored = readMap("emailCodes", email);
-        String code = stored.split("\\|")[0];
-        assertThat(userService.verifyCode(email, code)).isTrue();
-        assertThat(userService.verifyCode(email, "000000")).isFalse();
+        // 调用
+        userService.updateUser(testUser);
 
-        // 模拟过期
-        patchExpiry("emailCodes", email, -1000L);
-        assertThat(userService.verifyCode(email, code)).isFalse();
+        // 验证
+        verify(userMapper, times(1)).updateUser(any(User.class));
     }
 
     @Test
-    public void sendResetCode_and_resetPassword_workCorrectly() throws Exception {
-        String email = "reset@x.com";
-        when(userMapper.selectByEmail(email)).thenReturn(null);
-        assertThatThrownBy(() -> userService.sendResetCode(email))
-                .isInstanceOf(IllegalArgumentException.class);
+    void getUserById_shouldReturnUser() {
+        // 模拟
+        when(userMapper.selectUserById(1)).thenReturn(testUser);
 
-        User u = new User();
-        u.setEmail(email);
-        when(userMapper.selectByEmail(email)).thenReturn(u);
+        // 调用
+        User result = userService.getUserById(1);
 
-        userService.sendResetCode(email);
-        verify(emailUtil).sendVerificationEmail(eq(email), anyString());
-        String stored = readMap("resetCodes", email);
-        String code = stored.split("\\|")[0];
-
-        when(userMapper.updatePasswordByEmail(email, "newpwd")).thenReturn(1);
-        assertThat(userService.resetPassword(email, code, "newpwd")).isTrue();
-        assertThat(userService.resetPassword(email, code, "abc")).isFalse();
-
-        userService.sendResetCode(email);
-        String stored2 = readMap("resetCodes", email);
-        String code2 = stored2.split("\\|")[0];
-        patchExpiry("resetCodes", email, -2000L);
-        assertThat(userService.resetPassword(email, code2, "pw")).isFalse();
+        // 验证
+        assertEquals(testUser, result);
+        verify(userMapper, times(1)).selectUserById(1);
     }
 
-    // --- 反射辅助方法 ---
-    @SuppressWarnings("unchecked")
-    private void clearMap(String fieldName) throws Exception {
-        Field f = UserServImpl.class.getDeclaredField(fieldName);
-        f.setAccessible(true);
-        ((java.util.Map<String, String>)f.get(userService)).clear();
-    }
+    @Test
+    void getAllUsers_shouldReturnList() {
+        // 模拟
+        List<User> users = Arrays.asList(testUser, new User());
+        when(userMapper.selectAllUsers()).thenReturn(users);
 
-    @SuppressWarnings("unchecked")
-    private String readMap(String fieldName, String key) throws Exception {
-        Field f = UserServImpl.class.getDeclaredField(fieldName);
-        f.setAccessible(true);
-        return ((java.util.Map<String, String>)f.get(userService)).get(key);
-    }
+        // 调用
+        List<User> result = userService.getAllUsers();
 
-    @SuppressWarnings("unchecked")
-    private void patchExpiry(String fieldName, String key, long offsetMs) throws Exception {
-        String combined = readMap(fieldName, key);
-        String code = combined.split("\\|")[0];
-        long expire = System.currentTimeMillis() + offsetMs;
-        String updated = code + "|" + expire;
-        Field f = UserServImpl.class.getDeclaredField(fieldName);
-        f.setAccessible(true);
-        ((java.util.Map<String, String>)f.get(userService)).put(key, updated);
+        // 验证
+        assertEquals(2, result.size());
+        verify(userMapper, times(1)).selectAllUsers();
     }
-}
+}
\ 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
new file mode 100644
index 0000000..4c527c6
--- /dev/null
+++ b/src/test/java/edu/bjtu/groupone/backend/WorkControllerTest.java
@@ -0,0 +1,133 @@
+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 85e62c6..5277d54 100644
--- a/src/test/java/edu/bjtu/groupone/backend/WorkServiceTest.java
+++ b/src/test/java/edu/bjtu/groupone/backend/WorkServiceTest.java
@@ -4,20 +4,29 @@
 import edu.bjtu.groupone.backend.domain.entity.Category;
 import edu.bjtu.groupone.backend.domain.entity.Work;
 import edu.bjtu.groupone.backend.mapper.WorkMybatisMapper;
-//import edu.bjtu.groupone.backend.model.Category;
-//import edu.bjtu.groupone.backend.model.Work;
 import edu.bjtu.groupone.backend.service.CategoryService;
 import edu.bjtu.groupone.backend.service.WorkService;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.mockito.*;
-import org.springframework.data.domain.*;
+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.data.domain.Pageable;
 
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyList;
 import static org.mockito.Mockito.*;
 
+@ExtendWith(MockitoExtension.class)
 class WorkServiceTest {
 
     @Mock
@@ -29,30 +38,75 @@
     @InjectMocks
     private WorkService service;
 
+    private Work testWork;
+    private Category testCategory;
+
     @BeforeEach
-    void init() {
-        MockitoAnnotations.openMocks(this);
+    void setUp() {
+        testCategory = new Category(1L, "Test Category", null);
+
+        testWork = Work.builder()
+                .id(1L)
+                .title("Test Work")
+                .author("Author")
+                .views(100)
+                .category(testCategory)
+                .build();
     }
 
     @Test
-    void testGetWorks() {
-        Long categoryId = 1L;
-        List<Long> categoryIds = List.of(categoryId);
+    void addWork_shouldCallMapper() {
+        // 调用
+        service.addWork(testWork);
 
-        Work mockWork = Work.builder()
-                .id(10L)
-                .title("Test Title")
-                .author("Author")
-                .views(123)
-                .category(Category.builder().id(categoryId).name("Test").build())
-                .build();
-
-        Page<Work> workPage = new PageImpl<>(List.of(mockWork));
-        when(categoryService.getAllSubcategoryIds(categoryId)).thenReturn(categoryIds);
-        when(mapper.findByCategoryIdIn(eq(categoryIds), any(Pageable.class))).thenReturn(workPage);
-
-        Page<WorkResponse> result = service.getWorks(categoryId, 1, 10);
-        assertEquals(1, result.getTotalElements());
-        assertEquals("Test Title", result.getContent().get(0).getTitle());
+        // 验证
+        verify(mapper, times(1)).save(testWork);
     }
-}
+
+    @Test
+    void deleteWork_shouldCallMapper() {
+        // 调用
+        service.deleteWork(1L);
+
+        // 验证
+        verify(mapper, times(1)).deleteById(1L);
+    }
+
+    @Test
+    void updateWork_shouldCallMapper() {
+        // 调用
+        service.updateWork(testWork);
+
+        // 验证
+        verify(mapper, times(1)).update(testWork);
+    }
+
+    @Test
+    void getWorkById_shouldReturnWork() {
+        // 模拟
+        when(mapper.findById(1L)).thenReturn(testWork);
+
+        // 调用
+        Work result = service.getWorkById(1L);
+
+        // 验证
+        assertEquals(testWork, result);
+        verify(mapper, 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);
+
+        // 调用
+        Page<WorkResponse> result = service.getWorks(1L, 1, 10);
+
+        // 验证
+        assertEquals(1, result.getTotalElements());
+        assertEquals("Test Work", result.getContent().get(0).getTitle());
+        verify(mapper, times(1)).findByCategoryIdIn(anyList(), any(Pageable.class));
+    }
+}
\ No newline at end of file
diff --git a/src/test/resources/application-test.properties b/src/test/resources/application-test.properties
index 4fb95c7..b216159 100644
--- a/src/test/resources/application-test.properties
+++ b/src/test/resources/application-test.properties
@@ -1,5 +1,8 @@
-spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
+spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
 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.jpa.show-sql=true
-spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
\ No newline at end of file
+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
