diff --git a/src/test/java/com/pt5/pthouduan/controller/CommentControllerTest.java b/src/test/java/com/pt5/pthouduan/controller/CommentControllerTest.java
new file mode 100644
index 0000000..055dacf
--- /dev/null
+++ b/src/test/java/com/pt5/pthouduan/controller/CommentControllerTest.java
@@ -0,0 +1,127 @@
+package com.pt5.pthouduan.controller;
+
+import com.pt5.pthouduan.entity.Comment;
+import com.pt5.pthouduan.service.CommentService;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.*;
+import static org.junit.jupiter.api.Assertions.*;
+
+class CommentControllerTest {
+
+    @Mock
+    private CommentService commentService;
+
+    @InjectMocks
+    private CommentController commentController;
+
+    private MockMvc mockMvc;
+
+    @BeforeEach
+    void setUp() {
+        MockitoAnnotations.openMocks(this);
+        mockMvc = MockMvcBuilders.standaloneSetup(commentController).build();
+    }
+
+    @Test
+    void createComment_ShouldReturnCreatedComment() {
+        Comment inputComment = new Comment();
+        inputComment.setPostid(1);
+        inputComment.setUserid(100L);
+        inputComment.setPostCommentcontent("Test Comment");
+        inputComment.setCommenttime(LocalDateTime.now());
+
+        Comment savedComment = new Comment();
+        savedComment.setCommentid(1);
+        savedComment.setPostid(1);
+        savedComment.setUserid(100L);
+        savedComment.setPostCommentcontent("Test Comment");
+        savedComment.setCommenttime(inputComment.getCommenttime());
+
+        when(commentService.createComment(any(Comment.class))).thenReturn(savedComment);
+
+        Comment result = commentController.createComment(inputComment);
+
+        assertNotNull(result);
+        assertEquals("Test Comment", result.getPostCommentcontent());
+        assertEquals(100L, result.getUserid());
+    }
+
+    @Test
+    void deleteComment_ShouldReturnTrue_WhenSuccess() {
+        when(commentService.deleteComment(1)).thenReturn(true);
+
+        boolean result = commentController.deleteComment(1);
+
+        assertTrue(result);
+        verify(commentService).deleteComment(1);
+    }
+
+    @Test
+    void updateComment_ShouldReturnTrue_WhenSuccess() {
+        Comment updatedComment = new Comment();
+        updatedComment.setCommentid(1);
+        updatedComment.setPostCommentcontent("Updated content");
+
+        when(commentService.updateComment(any(Comment.class))).thenReturn(true);
+
+        boolean result = commentController.updateComment(updatedComment);
+
+        assertTrue(result);
+        verify(commentService).updateComment(updatedComment);
+    }
+
+    @Test
+    void getCommentsByPostId_ShouldReturnListOfComments() {
+        Comment comment1 = new Comment();
+        comment1.setCommentid(1);
+        comment1.setPostid(10);
+        comment1.setPostCommentcontent("Comment 1");
+
+        Comment comment2 = new Comment();
+        comment2.setCommentid(2);
+        comment2.setPostid(10);
+        comment2.setPostCommentcontent("Comment 2");
+
+        List<Comment> commentList = Arrays.asList(comment1, comment2);
+
+        when(commentService.getCommentsByPostId(10)).thenReturn(commentList);
+
+        List<Comment> result = commentController.getCommentsByPostId(10);
+
+        assertEquals(2, result.size());
+        assertEquals("Comment 1", result.get(0).getPostCommentcontent());
+    }
+
+    @Test
+    void likeComment_ShouldReturnTrue_WhenSuccess() {
+        when(commentService.likeComment(1)).thenReturn(true);
+
+        boolean result = commentController.likeComment(1);
+
+        assertTrue(result);
+        verify(commentService).likeComment(1);
+    }
+
+    @Test
+    void unlikeComment_ShouldReturnTrue_WhenSuccess() {
+        when(commentService.unlikeComment(1)).thenReturn(true);
+
+        boolean result = commentController.unlikeComment(1);
+
+        assertTrue(result);
+        verify(commentService).unlikeComment(1);
+    }
+}
diff --git a/src/test/java/com/pt5/pthouduan/service/CommentServiceTest.java b/src/test/java/com/pt5/pthouduan/service/CommentServiceTest.java
new file mode 100644
index 0000000..bfce395
--- /dev/null
+++ b/src/test/java/com/pt5/pthouduan/service/CommentServiceTest.java
@@ -0,0 +1,100 @@
+package com.pt5.pthouduan.service;
+
+import com.pt5.pthouduan.entity.Comment;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+class CommentServiceTest {
+
+    @Mock
+    private CommentService commentService;
+
+    @BeforeEach
+    void setUp() {
+        MockitoAnnotations.openMocks(this);
+    }
+
+    @Test
+    void createComment_ShouldReturnCreatedComment() {
+        Comment newComment = new Comment();
+        newComment.setUserid(1L);
+        newComment.setPostid(10);
+        newComment.setPostCommentcontent("这是一个评论");
+        newComment.setCommenttime(LocalDateTime.now());
+
+        when(commentService.createComment(any(Comment.class))).thenReturn(newComment);
+
+        Comment result = commentService.createComment(newComment);
+
+        assertNotNull(result);
+        assertEquals("这是一个评论", result.getPostCommentcontent());
+        verify(commentService).createComment(newComment);
+    }
+
+    @Test
+    void deleteComment_ShouldReturnTrue() {
+        when(commentService.deleteComment(1)).thenReturn(true);
+
+        boolean result = commentService.deleteComment(1);
+
+        assertTrue(result);
+        verify(commentService).deleteComment(1);
+    }
+
+    @Test
+    void updateComment_ShouldReturnTrue() {
+        Comment comment = new Comment();
+        comment.setCommentid(1);
+        comment.setPostCommentcontent("更新的评论");
+
+        when(commentService.updateComment(comment)).thenReturn(true);
+
+        boolean result = commentService.updateComment(comment);
+
+        assertTrue(result);
+        verify(commentService).updateComment(comment);
+    }
+
+    @Test
+    void getCommentsByPostId_ShouldReturnCommentsList() {
+        Comment comment = new Comment();
+        comment.setPostid(10);
+        comment.setPostCommentcontent("测试评论");
+
+        when(commentService.getCommentsByPostId(10)).thenReturn(Collections.singletonList(comment));
+
+        List<Comment> result = commentService.getCommentsByPostId(10);
+
+        assertEquals(1, result.size());
+        assertEquals("测试评论", result.get(0).getPostCommentcontent());
+    }
+
+    @Test
+    void likeComment_ShouldReturnTrue() {
+        when(commentService.likeComment(1)).thenReturn(true);
+
+        boolean result = commentService.likeComment(1);
+
+        assertTrue(result);
+        verify(commentService).likeComment(1);
+    }
+
+    @Test
+    void unlikeComment_ShouldReturnTrue() {
+        when(commentService.unlikeComment(1)).thenReturn(true);
+
+        boolean result = commentService.unlikeComment(1);
+
+        assertTrue(result);
+        verify(commentService).unlikeComment(1);
+    }
+}
