diff --git a/src/test/java/com/example/g8backend/service/SigninServiceImplTest.java b/src/test/java/com/example/g8backend/service/SigninServiceImplTest.java
index 298c4ac..48eec66 100644
--- a/src/test/java/com/example/g8backend/service/SigninServiceImplTest.java
+++ b/src/test/java/com/example/g8backend/service/SigninServiceImplTest.java
@@ -1,5 +1,6 @@
 package com.example.g8backend.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.example.g8backend.entity.User;
 import com.example.g8backend.entity.UserSignin;
 import com.example.g8backend.mapper.UserMapper;
@@ -11,6 +12,10 @@
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 import java.time.LocalDate;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
 import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.*;
@@ -78,4 +83,104 @@
         assertEquals(10, user.getSigninCount());
         assertEquals("lv3", user.getUserLevel());
     }
+    @Test
+    public void testGetSigninsByDateRange_NormalCase() {
+        // 模拟输入参数
+        Long userId = 1L;
+        LocalDate startDate = LocalDate.of(2023, 10, 1);
+        LocalDate endDate = LocalDate.of(2023, 10, 31);
+
+        // 构建模拟数据
+        UserSignin signin1 = new UserSignin();
+        signin1.setSigninId(1L);
+        signin1.setUserId(userId);
+        signin1.setSigninDate(LocalDate.of(2023, 10, 5));
+
+        UserSignin signin2 = new UserSignin();
+        signin2.setSigninId(2L);
+        signin2.setUserId(userId);
+        signin2.setSigninDate(LocalDate.of(2023, 10, 15));
+
+        List<UserSignin> mockSignins = Arrays.asList(signin1, signin2);
+
+        when(userSigninMapper.selectList(any(QueryWrapper.class))).thenReturn(mockSignins);
+
+        // 执行方法
+        List<UserSignin> result = signinService.getSigninsByDateRange(userId, startDate, endDate);
+
+        // 断言结果
+        assertEquals(2, result.size());
+        assertEquals(LocalDate.of(2023, 10, 5), result.get(0).getSigninDate());
+        assertEquals(LocalDate.of(2023, 10, 15), result.get(1).getSigninDate());
+        verify(userSigninMapper).selectList(any(QueryWrapper.class));
+    }
+
+    @Test
+    public void testGetSigninsByDateRange_NoRecords() {
+        Long userId = 1L;
+        LocalDate startDate = LocalDate.of(2023, 11, 1);
+        LocalDate endDate = LocalDate.of(2023, 11, 30);
+
+        when(userSigninMapper.selectList(any())).thenReturn(Collections.emptyList());
+
+        List<UserSignin> result = signinService.getSigninsByDateRange(userId, startDate, endDate);
+
+        assertTrue(result.isEmpty());
+    }
+
+    @Test
+    public void testGetSigninsByDateRange_SingleDay() {
+        Long userId = 1L;
+        LocalDate date = LocalDate.of(2023, 10, 10);
+
+        UserSignin signin = new UserSignin();
+        signin.setSigninId(3L);
+        signin.setUserId(userId);
+        signin.setSigninDate(date);
+
+        // 修正：返回包含模拟数据的列表
+        when(userSigninMapper.selectList(any(QueryWrapper.class))).thenReturn(Collections.singletonList(signin));
+
+        List<UserSignin> result = signinService.getSigninsByDateRange(userId, date, date);
+
+        assertEquals(1, result.size());
+        assertEquals(date, result.get(0).getSigninDate());
+    }
+    @Test
+    public void testGetSigninsByDateRange_InvalidDateOrder() {
+        Long userId = 1L;
+        LocalDate startDate = LocalDate.of(2023, 10, 31);
+        LocalDate endDate = LocalDate.of(2023, 10, 1);
+
+        when(userSigninMapper.selectList(any())).thenReturn(Collections.emptyList());
+
+        List<UserSignin> result = signinService.getSigninsByDateRange(userId, startDate, endDate);
+
+        assertTrue(result.isEmpty());
+    }
+
+    public void testGetSigninsByDateRange_SortedOrder() {
+        Long userId = 1L;
+        LocalDate startDate = LocalDate.of(2023, 10, 1);
+        LocalDate endDate = LocalDate.of(2023, 10, 31);
+
+        // 模拟数据并按日期升序排列
+        UserSignin signin1 = new UserSignin();
+        signin1.setSigninId(1L);
+        signin1.setSigninDate(LocalDate.of(2023, 10, 5));
+
+        UserSignin signin2 = new UserSignin();
+        signin2.setSigninId(2L);
+        signin2.setSigninDate(LocalDate.of(2023, 10, 15));
+
+        List<UserSignin> mockSignins = Arrays.asList(signin1, signin2); // 直接提供已排序的数据
+
+        when(userSigninMapper.selectList(any(QueryWrapper.class))).thenReturn(mockSignins);
+
+        List<UserSignin> result = signinService.getSigninsByDateRange(userId, startDate, endDate);
+
+        // 验证顺序
+        assertEquals(LocalDate.of(2023, 10, 5), result.get(0).getSigninDate());
+        assertEquals(LocalDate.of(2023, 10, 15), result.get(1).getSigninDate());
+    }
 }
\ No newline at end of file
