实现登录注册接口

Change-Id: I3d57cca89cac8945d562f6a39127b3454c1cd9ac
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);
+    }
+}