diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApi.java
index ffcf46dc0..98d4cdeef 100644
--- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApi.java
+++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApi.java
@@ -1,7 +1,7 @@
 package cn.iocoder.yudao.module.system.api.sms;
 
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
-import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeCheckReqDTO;
+import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeValidateReqDTO;
 import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
 import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
 
@@ -35,6 +35,6 @@ public interface SmsCodeApi {
      *
      * @param reqDTO 校验请求
      */
-    void checkSmsCode(@Valid SmsCodeCheckReqDTO reqDTO);
+    void validateSmsCode(@Valid SmsCodeValidateReqDTO reqDTO);
 
 }
diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/code/SmsCodeCheckReqDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/code/SmsCodeValidateReqDTO.java
similarity index 95%
rename from yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/code/SmsCodeCheckReqDTO.java
rename to yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/code/SmsCodeValidateReqDTO.java
index 92895bb4d..e7808354c 100644
--- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/code/SmsCodeCheckReqDTO.java
+++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/code/SmsCodeValidateReqDTO.java
@@ -14,7 +14,7 @@ import javax.validation.constraints.NotNull;
  * @author 芋道源码
  */
 @Data
-public class SmsCodeCheckReqDTO {
+public class SmsCodeValidateReqDTO {
 
     /**
      * 手机号
diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApiImpl.java
index 81957e082..23c5e4b3f 100644
--- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApiImpl.java
+++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApiImpl.java
@@ -1,6 +1,6 @@
 package cn.iocoder.yudao.module.system.api.sms;
 
-import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeCheckReqDTO;
+import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeValidateReqDTO;
 import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
 import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
 import cn.iocoder.yudao.module.system.service.sms.SmsCodeService;
@@ -32,8 +32,8 @@ public class SmsCodeApiImpl implements SmsCodeApi {
     }
 
     @Override
-    public void checkSmsCode(SmsCodeCheckReqDTO reqDTO) {
-        smsCodeService.checkSmsCode(reqDTO);
+    public void validateSmsCode(SmsCodeValidateReqDTO reqDTO) {
+        smsCodeService.validateSmsCode(reqDTO);
     }
 
 }
diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeService.java
index f71b8a6bd..c310949b2 100644
--- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeService.java
+++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeService.java
@@ -1,7 +1,7 @@
 package cn.iocoder.yudao.module.system.service.sms;
 
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
-import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeCheckReqDTO;
+import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeValidateReqDTO;
 import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
 import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
 
@@ -35,6 +35,6 @@ public interface SmsCodeService {
      *
      * @param reqDTO 校验请求
      */
-    void checkSmsCode(@Valid SmsCodeCheckReqDTO reqDTO);
+    void validateSmsCode(@Valid SmsCodeValidateReqDTO reqDTO);
 
 }
diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImpl.java
index 778445dd9..682b89eff 100644
--- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImpl.java
+++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImpl.java
@@ -3,11 +3,9 @@ package cn.iocoder.yudao.module.system.service.sms;
 import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.map.MapUtil;
-import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
-import cn.iocoder.yudao.framework.common.util.date.DateUtils;
-import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeCheckReqDTO;
 import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
 import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
+import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeValidateReqDTO;
 import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsCodeDO;
 import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsCodeMapper;
 import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
@@ -16,11 +14,11 @@ import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
-
 import java.time.LocalDateTime;
-import java.time.temporal.ChronoUnit;
 
 import static cn.hutool.core.util.RandomUtil.randomInt;
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.isToday;
 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
 
 /**
@@ -58,11 +56,11 @@ public class SmsCodeServiceImpl implements SmsCodeService {
         if (lastSmsCode != null) {
             if (LocalDateTimeUtil.between(lastSmsCode.getCreateTime(), LocalDateTime.now()).toMillis()
                     < smsCodeProperties.getSendFrequency().toMillis()) { // 发送过于频繁
-                throw ServiceExceptionUtil.exception(SMS_CODE_SEND_TOO_FAST);
+                throw exception(SMS_CODE_SEND_TOO_FAST);
             }
-            if (DateUtils.isToday(lastSmsCode.getCreateTime()) && // 必须是今天,才能计算超过当天的上限
+            if (isToday(lastSmsCode.getCreateTime()) && // 必须是今天,才能计算超过当天的上限
                     lastSmsCode.getTodayIndex() >= smsCodeProperties.getSendMaximumQuantityPerDay()) { // 超过当天发送的上限。
-                throw ServiceExceptionUtil.exception(SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY);
+                throw exception(SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY);
             }
             // TODO 芋艿:提升,每个 IP 每天可发送数量
             // TODO 芋艿:提升,每个 IP 每小时可发送数量
@@ -71,7 +69,7 @@ public class SmsCodeServiceImpl implements SmsCodeService {
         // 创建验证码记录
         String code = String.valueOf(randomInt(smsCodeProperties.getBeginCode(), smsCodeProperties.getEndCode() + 1));
         SmsCodeDO newSmsCode = SmsCodeDO.builder().mobile(mobile).code(code).scene(scene)
-                .todayIndex(lastSmsCode != null && DateUtils.isToday(lastSmsCode.getCreateTime()) ? lastSmsCode.getTodayIndex() + 1 : 1)
+                .todayIndex(lastSmsCode != null && isToday(lastSmsCode.getCreateTime()) ? lastSmsCode.getTodayIndex() + 1 : 1)
                 .createIp(ip).used(false).build();
         smsCodeMapper.insert(newSmsCode);
         return code;
@@ -80,32 +78,32 @@ public class SmsCodeServiceImpl implements SmsCodeService {
     @Override
     public void useSmsCode(SmsCodeUseReqDTO reqDTO) {
         // 检测验证码是否有效
-        SmsCodeDO lastSmsCode = this.checkSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene());
+        SmsCodeDO lastSmsCode = validateSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene());
         // 使用验证码
         smsCodeMapper.updateById(SmsCodeDO.builder().id(lastSmsCode.getId())
                 .used(true).usedTime(LocalDateTime.now()).usedIp(reqDTO.getUsedIp()).build());
     }
 
     @Override
-    public void checkSmsCode(SmsCodeCheckReqDTO reqDTO) {
-        checkSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene());
+    public void validateSmsCode(SmsCodeValidateReqDTO reqDTO) {
+        validateSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene());
     }
 
-    public SmsCodeDO checkSmsCode0(String mobile, String code, Integer scene) {
+    private SmsCodeDO validateSmsCode0(String mobile, String code, Integer scene) {
         // 校验验证码
         SmsCodeDO lastSmsCode = smsCodeMapper.selectLastByMobile(mobile, code, scene);
         // 若验证码不存在,抛出异常
         if (lastSmsCode == null) {
-            throw ServiceExceptionUtil.exception(SMS_CODE_NOT_FOUND);
+            throw exception(SMS_CODE_NOT_FOUND);
         }
         // 超过时间
         if (LocalDateTimeUtil.between(lastSmsCode.getCreateTime(), LocalDateTime.now()).toMillis()
                 >= smsCodeProperties.getExpireTimes().toMillis()) { // 验证码已过期
-            throw ServiceExceptionUtil.exception(SMS_CODE_EXPIRED);
+            throw exception(SMS_CODE_EXPIRED);
         }
         // 判断验证码是否已被使用
         if (Boolean.TRUE.equals(lastSmsCode.getUsed())) {
-            throw ServiceExceptionUtil.exception(SMS_CODE_USED);
+            throw exception(SMS_CODE_USED);
         }
         return lastSmsCode;
     }
diff --git a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImplTest.java b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImplTest.java
new file mode 100644
index 000000000..e50d025af
--- /dev/null
+++ b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImplTest.java
@@ -0,0 +1,209 @@
+package cn.iocoder.yudao.module.system.service.sms;
+
+import cn.hutool.core.map.MapUtil;
+import cn.iocoder.yudao.framework.mybatis.core.enums.SqlConstants;
+import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
+import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
+import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
+import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeValidateReqDTO;
+import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsCodeDO;
+import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsCodeMapper;
+import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
+import cn.iocoder.yudao.module.system.framework.sms.SmsCodeProperties;
+import com.baomidou.mybatisplus.annotation.DbType;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.context.annotation.Import;
+
+import javax.annotation.Resource;
+import java.time.Duration;
+import java.time.LocalDateTime;
+
+import static cn.hutool.core.util.RandomUtil.randomEle;
+import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
+import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
+import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
+import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@Import(SmsCodeServiceImpl.class)
+public class SmsCodeServiceImplTest extends BaseDbUnitTest {
+
+    @Resource
+    private SmsCodeServiceImpl smsCodeService;
+
+    @Resource
+    private SmsCodeMapper smsCodeMapper;
+
+    @MockBean
+    private SmsCodeProperties smsCodeProperties;
+    @MockBean
+    private SmsSendService smsSendService;
+
+    @BeforeEach
+    public void setUp() {
+        when(smsCodeProperties.getExpireTimes()).thenReturn(Duration.ofMinutes(5));
+        when(smsCodeProperties.getSendFrequency()).thenReturn(Duration.ofMinutes(1));
+        when(smsCodeProperties.getSendMaximumQuantityPerDay()).thenReturn(10);
+        when(smsCodeProperties.getBeginCode()).thenReturn(9999);
+        when(smsCodeProperties.getEndCode()).thenReturn(9999);
+    }
+
+    @Test
+    public void sendSmsCode_success() {
+        // 准备参数
+        SmsCodeSendReqDTO reqDTO = randomPojo(SmsCodeSendReqDTO.class, o -> {
+            o.setMobile("15601691300");
+            o.setScene(SmsSceneEnum.MEMBER_LOGIN.getScene());
+        });
+        // mock 方法
+        SqlConstants.init(DbType.MYSQL);
+
+        // 调用
+        smsCodeService.sendSmsCode(reqDTO);
+        // 断言 code 验证码
+        SmsCodeDO smsCodeDO = smsCodeMapper.selectOne(null);
+        assertPojoEquals(reqDTO, smsCodeDO);
+        assertEquals("9999", smsCodeDO.getCode());
+        assertEquals(1, smsCodeDO.getTodayIndex());
+        assertFalse(smsCodeDO.getUsed());
+        // 断言调用
+        verify(smsSendService).sendSingleSms(eq(reqDTO.getMobile()), isNull(), isNull(),
+                eq("user-sms-login"), eq(MapUtil.of("code", "9999")));
+    }
+
+    @Test
+    public void sendSmsCode_tooFast() {
+        // mock 数据
+        SmsCodeDO smsCodeDO = randomPojo(SmsCodeDO.class,
+                o -> o.setMobile("15601691300").setTodayIndex(1));
+        smsCodeMapper.insert(smsCodeDO);
+        // 准备参数
+        SmsCodeSendReqDTO reqDTO = randomPojo(SmsCodeSendReqDTO.class, o -> {
+            o.setMobile("15601691300");
+            o.setScene(SmsSceneEnum.MEMBER_LOGIN.getScene());
+        });
+        // mock 方法
+        SqlConstants.init(DbType.MYSQL);
+
+        // 调用,并断言异常
+        assertServiceException(() -> smsCodeService.sendSmsCode(reqDTO),
+                SMS_CODE_SEND_TOO_FAST);
+    }
+
+    @Test
+    public void sendSmsCode_exceedDay() {
+        // mock 数据
+        SmsCodeDO smsCodeDO = randomPojo(SmsCodeDO.class,
+                o -> o.setMobile("15601691300").setTodayIndex(10).setCreateTime(LocalDateTime.now()));
+        smsCodeMapper.insert(smsCodeDO);
+        // 准备参数
+        SmsCodeSendReqDTO reqDTO = randomPojo(SmsCodeSendReqDTO.class, o -> {
+            o.setMobile("15601691300");
+            o.setScene(SmsSceneEnum.MEMBER_LOGIN.getScene());
+        });
+        // mock 方法
+        SqlConstants.init(DbType.MYSQL);
+        when(smsCodeProperties.getSendFrequency()).thenReturn(Duration.ofMillis(0));
+
+        // 调用,并断言异常
+        assertServiceException(() -> smsCodeService.sendSmsCode(reqDTO),
+                SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY);
+    }
+
+    @Test
+    public void testUseSmsCode_success() {
+        // 准备参数
+        SmsCodeUseReqDTO reqDTO = randomPojo(SmsCodeUseReqDTO.class, o -> {
+            o.setMobile("15601691300");
+            o.setScene(randomEle(SmsSceneEnum.values()).getScene());
+        });
+        // mock 数据
+        SqlConstants.init(DbType.MYSQL);
+        smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> {
+            o.setMobile(reqDTO.getMobile()).setScene(reqDTO.getScene())
+                    .setCode(reqDTO.getCode()).setUsed(false);
+        }));
+
+        // 调用
+        smsCodeService.useSmsCode(reqDTO);
+        // 断言
+        SmsCodeDO smsCodeDO = smsCodeMapper.selectOne(null);
+        assertTrue(smsCodeDO.getUsed());
+        assertNotNull(smsCodeDO.getUsedTime());
+        assertEquals(reqDTO.getUsedIp(), smsCodeDO.getUsedIp());
+    }
+
+    @Test
+    public void validateSmsCode_success() {
+        // 准备参数
+        SmsCodeValidateReqDTO reqDTO = randomPojo(SmsCodeValidateReqDTO.class, o -> {
+            o.setMobile("15601691300");
+            o.setScene(randomEle(SmsSceneEnum.values()).getScene());
+        });
+        // mock 数据
+        SqlConstants.init(DbType.MYSQL);
+        smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> o.setMobile(reqDTO.getMobile())
+                .setScene(reqDTO.getScene()).setCode(reqDTO.getCode()).setUsed(false)));
+
+        // 调用
+        smsCodeService.validateSmsCode(reqDTO);
+    }
+
+    @Test
+    public void validateSmsCode_notFound() {
+        // 准备参数
+        SmsCodeValidateReqDTO reqDTO = randomPojo(SmsCodeValidateReqDTO.class, o -> {
+            o.setMobile("15601691300");
+            o.setScene(randomEle(SmsSceneEnum.values()).getScene());
+        });
+        // mock 数据
+        SqlConstants.init(DbType.MYSQL);
+
+        // 调用,并断言异常
+        assertServiceException(() -> smsCodeService.validateSmsCode(reqDTO),
+                SMS_CODE_NOT_FOUND);
+    }
+
+    @Test
+    public void validateSmsCode_expired() {
+        // 准备参数
+        SmsCodeValidateReqDTO reqDTO = randomPojo(SmsCodeValidateReqDTO.class, o -> {
+            o.setMobile("15601691300");
+            o.setScene(randomEle(SmsSceneEnum.values()).getScene());
+        });
+        // mock 数据
+        SqlConstants.init(DbType.MYSQL);
+        smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> o.setMobile(reqDTO.getMobile())
+                .setScene(reqDTO.getScene()).setCode(reqDTO.getCode()).setUsed(false)
+                .setCreateTime(LocalDateTime.now().minusMinutes(6))));
+
+        // 调用,并断言异常
+        assertServiceException(() -> smsCodeService.validateSmsCode(reqDTO),
+                SMS_CODE_EXPIRED);
+    }
+
+    @Test
+    public void validateSmsCode_used() {
+        // 准备参数
+        SmsCodeValidateReqDTO reqDTO = randomPojo(SmsCodeValidateReqDTO.class, o -> {
+            o.setMobile("15601691300");
+            o.setScene(randomEle(SmsSceneEnum.values()).getScene());
+        });
+        // mock 数据
+        SqlConstants.init(DbType.MYSQL);
+        smsCodeMapper.insert(randomPojo(SmsCodeDO.class, o -> o.setMobile(reqDTO.getMobile())
+                .setScene(reqDTO.getScene()).setCode(reqDTO.getCode()).setUsed(true)
+                .setCreateTime(LocalDateTime.now())));
+
+        // 调用,并断言异常
+        assertServiceException(() -> smsCodeService.validateSmsCode(reqDTO),
+                SMS_CODE_USED);
+    }
+
+}
diff --git a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceTest.java b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImplTest.java
similarity index 99%
rename from yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceTest.java
rename to yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImplTest.java
index 546867867..2380ca09e 100644
--- a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceTest.java
+++ b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImplTest.java
@@ -34,7 +34,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 @Import(SmsLogServiceImpl.class)
-public class SmsLogServiceTest extends BaseDbUnitTest {
+public class SmsLogServiceImplTest extends BaseDbUnitTest {
 
     @Resource
     private SmsLogServiceImpl smsLogService;
diff --git a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceTest.java b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImplTest.java
similarity index 99%
rename from yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceTest.java
rename to yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImplTest.java
index 37b361449..868ae7865 100644
--- a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceTest.java
+++ b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImplTest.java
@@ -34,7 +34,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.*;
 
-public class SmsSendServiceTest extends BaseMockitoUnitTest {
+public class SmsSendServiceImplTest extends BaseMockitoUnitTest {
 
     @InjectMocks
     private SmsSendServiceImpl smsService;
diff --git a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceTest.java b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceImplTest.java
similarity index 98%
rename from yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceTest.java
rename to yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceImplTest.java
index a89d1b2e1..b72880285 100644
--- a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceTest.java
+++ b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceImplTest.java
@@ -30,9 +30,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.function.Consumer;
 
-import static cn.hutool.core.bean.BeanUtil.getFieldValue;
 import static cn.hutool.core.util.RandomUtil.randomEle;
-import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.max;
 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime;
 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
@@ -43,7 +41,7 @@ import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.*;
 
 @Import(SmsTemplateServiceImpl.class)
-public class SmsTemplateServiceTest extends BaseDbUnitTest {
+public class SmsTemplateServiceImplTest extends BaseDbUnitTest {
 
     @Resource
     private SmsTemplateServiceImpl smsTemplateService;
diff --git a/yudao-module-system/yudao-module-system-biz/src/test/resources/sql/clean.sql b/yudao-module-system/yudao-module-system-biz/src/test/resources/sql/clean.sql
index 1be69f28b..6d9dbf4b9 100644
--- a/yudao-module-system/yudao-module-system-biz/src/test/resources/sql/clean.sql
+++ b/yudao-module-system/yudao-module-system-biz/src/test/resources/sql/clean.sql
@@ -14,6 +14,7 @@ DELETE FROM "system_users";
 DELETE FROM "system_sms_channel";
 DELETE FROM "system_sms_template";
 DELETE FROM "system_sms_log";
+DELETE FROM "system_sms_code";
 DELETE FROM "system_error_code";
 DELETE FROM "system_social_user";
 DELETE FROM "system_social_user_bind";
diff --git a/yudao-module-system/yudao-module-system-biz/src/test/resources/sql/create_tables.sql b/yudao-module-system/yudao-module-system-biz/src/test/resources/sql/create_tables.sql
index bf135f39e..89074492c 100644
--- a/yudao-module-system/yudao-module-system-biz/src/test/resources/sql/create_tables.sql
+++ b/yudao-module-system/yudao-module-system-biz/src/test/resources/sql/create_tables.sql
@@ -377,6 +377,24 @@ CREATE TABLE IF NOT EXISTS "system_sms_log" (
    PRIMARY KEY ("id")
 ) COMMENT '短信日志';
 
+CREATE TABLE IF NOT EXISTS "system_sms_code" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "mobile" varchar(11) NOT NULL,
+    "code" varchar(11) NOT NULL,
+    "scene" bigint NOT NULL,
+    "create_ip" varchar NOT NULL,
+    "today_index" int NOT NULL,
+    "used" bit NOT NULL DEFAULT FALSE,
+    "used_time" timestamp DEFAULT NULL,
+    "used_ip" varchar NULL,
+    "creator" varchar(64) DEFAULT '',
+    "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater" varchar(64) DEFAULT '',
+    "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    PRIMARY KEY ("id")
+) COMMENT '短信日志';
+
 CREATE TABLE IF NOT EXISTS "system_error_code" (
   "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
   "type" tinyint NOT NULL DEFAULT '0',