diff --git a/src/test/java/com/pt5/pthouduan/ControllerTest/TrafficControllerTest.java b/src/test/java/com/pt5/pthouduan/ControllerTest/TrafficControllerTest.java
new file mode 100644
index 0000000..81bbe7e
--- /dev/null
+++ b/src/test/java/com/pt5/pthouduan/ControllerTest/TrafficControllerTest.java
@@ -0,0 +1,84 @@
+package com.pt5.pthouduan.ControllerTest;
+
+
+import com.pt5.pthouduan.controller.TrafficController;
+import com.pt5.pthouduan.entity.UserTrafficStat;
+import com.pt5.pthouduan.mapper.UserTrafficMapper;
+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.LocalDate;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+class TrafficControllerTest {
+
+    private MockMvc mockMvc;
+
+    @Mock
+    private UserTrafficMapper userTrafficMapper; // 模拟 Mapper
+
+    @InjectMocks
+    private TrafficController trafficController; // 注入 Controller
+
+    @BeforeEach
+    void setUp() {
+        MockitoAnnotations.openMocks(this); // 初始化 Mock
+        mockMvc = MockMvcBuilders.standaloneSetup(trafficController).build(); // 构建 MockMvc
+    }
+
+    @Test
+    void getUserTrafficStats_shouldReturnStats_whenPasskeyAndDatesAreValid() throws Exception {
+        // 准备测试数据
+        String passkey = "test-passkey";
+        LocalDate startDate = LocalDate.of(2023, 1, 1);
+        LocalDate endDate = LocalDate.of(2023, 1, 31);
+
+        UserTrafficStat mockStats = new UserTrafficStat();
+        mockStats.setTotalUploaded(1024L);
+        mockStats.setTotalDownloaded(2048L);
+
+        // 模拟 Mapper 行为
+        when(userTrafficMapper.getUserTrafficStats(anyString(), any(LocalDate.class), any(LocalDate.class)))
+                .thenReturn(mockStats);
+
+        // 发起 GET 请求并验证响应
+        mockMvc.perform(get("/api/traffic/user-stats")
+                        .param("passkey", passkey)
+                        .param("startDate", startDate.toString())
+                        .param("endDate", endDate.toString())
+                        .contentType(MediaType.APPLICATION_JSON))
+                .andExpect(status().isOk()); // 预期 HTTP 200
+    }
+
+    @Test
+    void getUserTrafficStats_shouldReturn400_whenPasskeyIsMissing() throws Exception {
+        // 不传 passkey，预期返回 400 Bad Request
+        mockMvc.perform(get("/api/traffic/user-stats")
+                        .param("startDate", "2023-01-01")
+                        .param("endDate", "2023-01-31")
+                        .contentType(MediaType.APPLICATION_JSON))
+                .andExpect(status().isBadRequest());
+    }
+
+    @Test
+    void getUserTrafficStats_shouldReturn400_whenDatesAreInvalid() throws Exception {
+        // 传入无效日期格式，预期返回 400 Bad Request
+        mockMvc.perform(get("/api/traffic/user-stats")
+                        .param("passkey", "test-passkey")
+                        .param("startDate", "2023-01-01-invalid")
+                        .param("endDate", "2023-01-31")
+                        .contentType(MediaType.APPLICATION_JSON))
+                .andExpect(status().isBadRequest());
+    }
+}
\ No newline at end of file
