diff --git a/src/test/java/edu/bjtu/groupone/backend/UserControllerTest.java b/src/test/java/edu/bjtu/groupone/backend/UserControllerTest.java
new file mode 100644
index 0000000..7e2f691
--- /dev/null
+++ b/src/test/java/edu/bjtu/groupone/backend/UserControllerTest.java
@@ -0,0 +1,82 @@
+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 java.time.LocalDateTime;
+
+import ch.qos.logback.classic.Logger;
+import org.slf4j.LoggerFactory;
+import edu.bjtu.groupone.backend.mapper.UserMapper;
+import edu.bjtu.groupone.backend.mapper.InviteCodeMapper;
+import edu.bjtu.groupone.backend.model.User;
+import edu.bjtu.groupone.backend.model.InviteCode;
+import edu.bjtu.groupone.backend.service.impl.UserServImpl;
+import edu.bjtu.groupone.backend.service.impl.InviteCodeServiceImpl;
+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 {
+
+    // 初始化 Logger，避免空指针
+    private static final Logger log = (Logger) LoggerFactory.getLogger(UserControllerTest.class);
+
+    @Mock
+    private UserMapper userMapper;
+
+    @Mock
+    private InviteCodeMapper inviteCodeMapper;
+
+    @InjectMocks
+    private UserServImpl userService;
+
+    @InjectMocks
+    private InviteCodeServiceImpl inviteCodeService;
+
+    @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);
+    }
+
+    @Test
+    public void testUseInviteCode() {
+        String inviteCode = "TESTCODE";
+
+        // 构造一个有效的 InviteCode，注意设置 expiryTime
+        InviteCode dummy = new InviteCode();
+        dummy.setCode(inviteCode);
+        dummy.setRemainingUses(1);
+        // 设置有效期在未来，避免调用 expiryTime.isBefore(...)
+        dummy.setExpiryTime(LocalDateTime.now().plusDays(1));
+
+        // Stub 两个 Mapper 方法
+        when(inviteCodeMapper.selectByCode(inviteCode)).thenReturn(dummy);
+        when(inviteCodeMapper.decrementRemainingUses(inviteCode)).thenReturn(1);
+
+        // 调用 service
+        boolean used = inviteCodeService.useInviteCode(inviteCode);
+
+        // 断言和验证
+        assertThat(used).isTrue();
+        verify(inviteCodeMapper, times(1)).selectByCode(inviteCode);
+        verify(inviteCodeMapper, times(1)).decrementRemainingUses(inviteCode);
+    }
+}
