diff --git a/src/test/java/com/example/g8backend/service/AdminServiceImplTest.java b/src/test/java/com/example/g8backend/service/AdminServiceImplTest.java
index f8e6229..a8983ba 100644
--- a/src/test/java/com/example/g8backend/service/AdminServiceImplTest.java
+++ b/src/test/java/com/example/g8backend/service/AdminServiceImplTest.java
@@ -1,5 +1,6 @@
 package com.example.g8backend.service;
 
+import com.example.g8backend.entity.Post;
 import com.example.g8backend.entity.User;
 import com.example.g8backend.mapper.UserMapper;
 import com.example.g8backend.service.impl.AdminServiceImpl;
@@ -8,6 +9,10 @@
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
+import com.example.g8backend.mapper.PostMapper;
+
+import java.time.LocalDateTime;
+
 import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
@@ -17,6 +22,8 @@
     private UserMapper userMapper;
     @InjectMocks
     private AdminServiceImpl adminService;
+    @Mock
+    private PostMapper postMapper;
 
     @Test
     public void testGrantVip_Success() {
@@ -35,4 +42,106 @@
         boolean result = adminService.grantVip(1L);
         assertFalse(result);
     }
+
+    void testBanUser_Success() {
+        User user = new User().setUserId(1L);
+        when(userMapper.selectById(1L)).thenReturn(user);
+        when(userMapper.updateById(any(User.class))).thenReturn(1);
+
+        boolean result = adminService.banUser(1L, "违规操作", 1001L);
+        assertTrue(result);
+
+        assertTrue(user.getIsBanned());
+        assertEquals("违规操作", user.getBannedReason());
+        assertNotNull(user.getBannedAt());
+        assertEquals(1001L, user.getBannedBy());
+        verify(userMapper).updateById(any(User.class));
+    }
+
+    @Test
+    void testBanUser_UserNotFound() {
+        when(userMapper.selectById(1L)).thenReturn(null);
+        boolean result = adminService.banUser(1L, "原因", 1001L);
+        assertFalse(result);
+        verify(userMapper, never()).updateById(any(User.class));
+    }
+
+    @Test
+    void testUnbanUser_Success() {
+        User user = new User().setUserId(1L)
+                .setIsBanned(true)
+                .setBannedReason("原因")
+                .setBannedAt(LocalDateTime.now())
+                .setBannedBy(1001L);
+        when(userMapper.selectById(1L)).thenReturn(user);
+        when(userMapper.updateById(any(User.class))).thenReturn(1);
+
+        boolean result = adminService.unbanUser(1L, 1001L);
+        assertTrue(result);
+
+        assertFalse(user.getIsBanned());
+        assertNull(user.getBannedReason());
+        assertNull(user.getBannedAt());
+        assertNull(user.getBannedBy());
+        verify(userMapper).updateById(any(User.class));
+    }
+
+    @Test
+    void testUnbanUser_UserNotFound() {
+        when(userMapper.selectById(1L)).thenReturn(null);
+        boolean result = adminService.unbanUser(1L, 1001L);
+        assertFalse(result);
+        verify(userMapper, never()).updateById(any(User.class));
+    }
+
+    @Test
+    void testLockPost_Success() {
+        Post post = new Post().setPostId(1L);
+        when(postMapper.selectById(1L)).thenReturn(post);
+        when(postMapper.updateById(any(Post.class))).thenReturn(1);
+
+        boolean result = adminService.lockPost(1L, "违规内容", 1001L);
+        assertTrue(result);
+
+        assertTrue(post.getIsLocked());
+        assertEquals("违规内容", post.getLockedReason());
+        assertNotNull(post.getLockedAt());
+        assertEquals(1001L, post.getLockedBy());
+        verify(postMapper).updateById(any(Post.class));
+    }
+
+    @Test
+    void testLockPost_PostNotFound() {
+        when(postMapper.selectById(1L)).thenReturn(null);
+        boolean result = adminService.lockPost(1L, "原因", 1001L);
+        assertFalse(result);
+        verify(postMapper, never()).updateById(any(Post.class));
+    }
+
+    @Test
+    void testUnlockPost_Success() {
+        Post post = new Post().setPostId(1L)
+                .setIsLocked(true)
+                .setLockedReason("原因")
+                .setLockedAt(LocalDateTime.now())
+                .setLockedBy(1001L);
+        when(postMapper.selectById(1L)).thenReturn(post);
+        when(postMapper.updateById(any(Post.class))).thenReturn(1);
+
+        boolean result = adminService.unlockPost(1L, 1001L);
+        assertTrue(result);
+
+        assertFalse(post.getIsLocked());
+        assertNull(post.getLockedReason());
+        assertNull(post.getLockedAt());
+        assertNull(post.getLockedBy());
+        verify(postMapper).updateById(any(Post.class));
+    }
+    @Test
+    void testUnlockPost_PostNotFound() {
+        when(postMapper.selectById(1L)).thenReturn(null);
+        boolean result = adminService.unlockPost(1L, 1001L);
+        assertFalse(result);
+        verify(postMapper, never()).updateById(any(Post.class));
+    }
 }
\ No newline at end of file
