Commit c197417d92d7ebe0038f08bd393b867ab40f3b66
1 parent
75d21928
修改 system logger junit review 后提出的问题
Showing
5 changed files
with
44 additions
and
65 deletions
src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/service/OperateLogFrameworkService.java
| ... | ... | @@ -2,13 +2,16 @@ package cn.iocoder.dashboard.framework.logger.operatelog.core.service; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogCreateReqVO; |
| 4 | 4 | |
| 5 | +import java.util.concurrent.Future; | |
| 6 | + | |
| 5 | 7 | public interface OperateLogFrameworkService { |
| 6 | 8 | |
| 7 | 9 | /** |
| 8 | - * 要不记录操作日志 | |
| 10 | + * 异步记录操作日志 | |
| 9 | 11 | * |
| 10 | 12 | * @param reqVO 操作日志请求 |
| 13 | + * @return true: 记录成功,false: 记录失败 | |
| 11 | 14 | */ |
| 12 | - void createOperateLogAsync(SysOperateLogCreateReqVO reqVO); | |
| 15 | + Future<Boolean> createOperateLogAsync(SysOperateLogCreateReqVO reqVO); | |
| 13 | 16 | |
| 14 | 17 | } | ... | ... |
src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysOperateLogServiceImpl.java
| ... | ... | @@ -7,20 +7,22 @@ import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOp |
| 7 | 7 | import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; |
| 8 | 8 | import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; |
| 9 | 9 | import cn.iocoder.dashboard.modules.system.convert.logger.SysOperateLogConvert; |
| 10 | -import cn.iocoder.dashboard.modules.system.dal.mysql.logger.SysOperateLogMapper; | |
| 11 | 10 | import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysOperateLogDO; |
| 12 | 11 | import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; |
| 12 | +import cn.iocoder.dashboard.modules.system.dal.mysql.logger.SysOperateLogMapper; | |
| 13 | 13 | import cn.iocoder.dashboard.modules.system.service.logger.SysOperateLogService; |
| 14 | 14 | import cn.iocoder.dashboard.modules.system.service.user.SysUserService; |
| 15 | 15 | import cn.iocoder.dashboard.util.string.StrUtils; |
| 16 | 16 | import lombok.extern.slf4j.Slf4j; |
| 17 | 17 | import org.springframework.scheduling.annotation.Async; |
| 18 | +import org.springframework.scheduling.annotation.AsyncResult; | |
| 18 | 19 | import org.springframework.stereotype.Service; |
| 19 | 20 | |
| 20 | 21 | import javax.annotation.Resource; |
| 21 | 22 | import java.util.Collection; |
| 22 | 23 | import java.util.Collections; |
| 23 | 24 | import java.util.List; |
| 25 | +import java.util.concurrent.Future; | |
| 24 | 26 | |
| 25 | 27 | import static cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysOperateLogDO.JAVA_METHOD_ARGS_MAX_LENGTH; |
| 26 | 28 | import static cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysOperateLogDO.RESULT_MAX_LENGTH; |
| ... | ... | @@ -38,16 +40,18 @@ public class SysOperateLogServiceImpl implements SysOperateLogService { |
| 38 | 40 | |
| 39 | 41 | @Override |
| 40 | 42 | @Async |
| 41 | - public void createOperateLogAsync(SysOperateLogCreateReqVO reqVO) { | |
| 43 | + public Future<Boolean> createOperateLogAsync(SysOperateLogCreateReqVO reqVO) { | |
| 44 | + boolean success = false; | |
| 42 | 45 | try { |
| 43 | 46 | SysOperateLogDO logDO = SysOperateLogConvert.INSTANCE.convert(reqVO); |
| 44 | 47 | logDO.setJavaMethodArgs(StrUtils.maxLength(logDO.getJavaMethodArgs(), JAVA_METHOD_ARGS_MAX_LENGTH)); |
| 45 | 48 | logDO.setResultData(StrUtils.maxLength(logDO.getResultData(), RESULT_MAX_LENGTH)); |
| 46 | - operateLogMapper.insert(logDO); | |
| 49 | + success = operateLogMapper.insert(logDO) == 1; | |
| 47 | 50 | } catch (Throwable throwable) { |
| 48 | 51 | // 仅仅打印日志,不对外抛出。原因是,还是要保留现场数据。 |
| 49 | 52 | log.error("[createOperateLogAsync][记录操作日志异常,日志为 ({})]", reqVO, throwable); |
| 50 | 53 | } |
| 54 | + return new AsyncResult<>(success); | |
| 51 | 55 | } |
| 52 | 56 | |
| 53 | 57 | @Override | ... | ... |
src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysLoginLogServiceImplTest.java
| ... | ... | @@ -3,14 +3,13 @@ package cn.iocoder.dashboard.modules.system.service.logger; |
| 3 | 3 | import cn.hutool.core.util.ArrayUtil; |
| 4 | 4 | import cn.hutool.core.util.RandomUtil; |
| 5 | 5 | import cn.hutool.core.util.ReflectUtil; |
| 6 | -import cn.iocoder.dashboard.BaseSpringBootUnitTest; | |
| 6 | +import cn.iocoder.dashboard.BaseDbUnitTest; | |
| 7 | 7 | import cn.iocoder.dashboard.common.pojo.PageResult; |
| 8 | 8 | import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; |
| 9 | 9 | import cn.iocoder.dashboard.framework.tracer.core.util.TracerUtils; |
| 10 | 10 | import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO; |
| 11 | 11 | import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; |
| 12 | 12 | import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; |
| 13 | -import cn.iocoder.dashboard.modules.system.convert.logger.SysLoginLogConvert; | |
| 14 | 13 | import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysLoginLogDO; |
| 15 | 14 | import cn.iocoder.dashboard.modules.system.dal.mysql.logger.SysLoginLogMapper; |
| 16 | 15 | import cn.iocoder.dashboard.modules.system.enums.logger.SysLoginLogTypeEnum; |
| ... | ... | @@ -19,6 +18,7 @@ import cn.iocoder.dashboard.modules.system.service.logger.impl.SysLoginLogServic |
| 19 | 18 | import cn.iocoder.dashboard.util.RandomUtils; |
| 20 | 19 | import cn.iocoder.dashboard.util.object.ObjectUtils; |
| 21 | 20 | import org.junit.jupiter.api.Test; |
| 21 | +import org.springframework.context.annotation.Import; | |
| 22 | 22 | |
| 23 | 23 | import javax.annotation.Resource; |
| 24 | 24 | import java.lang.reflect.Field; |
| ... | ... | @@ -30,7 +30,8 @@ import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; |
| 30 | 30 | import static cn.iocoder.dashboard.util.date.DateUtils.buildTime; |
| 31 | 31 | import static org.junit.jupiter.api.Assertions.assertEquals; |
| 32 | 32 | |
| 33 | -public class SysLoginLogServiceImplTest extends BaseSpringBootUnitTest { | |
| 33 | +@Import(SysLoginLogServiceImpl.class) | |
| 34 | +public class SysLoginLogServiceImplTest extends BaseDbUnitTest { | |
| 34 | 35 | |
| 35 | 36 | @Resource |
| 36 | 37 | private SysLoginLogServiceImpl sysLoginLogService; |
| ... | ... | @@ -40,7 +41,6 @@ public class SysLoginLogServiceImplTest extends BaseSpringBootUnitTest { |
| 40 | 41 | |
| 41 | 42 | @Test |
| 42 | 43 | public void testCreateLoginLog() { |
| 43 | - | |
| 44 | 44 | String traceId = TracerUtils.getTraceId(); |
| 45 | 45 | SysLoginLogCreateReqVO reqVO = RandomUtils.randomPojo(SysLoginLogCreateReqVO.class, vo -> { |
| 46 | 46 | // 指定随机的范围,避免超出范围入库失败 |
| ... | ... | @@ -50,19 +50,12 @@ public class SysLoginLogServiceImplTest extends BaseSpringBootUnitTest { |
| 50 | 50 | vo.setTraceId(traceId); |
| 51 | 51 | }); |
| 52 | 52 | |
| 53 | - | |
| 54 | 53 | // 执行service方法 |
| 55 | 54 | sysLoginLogService.createLoginLog(reqVO); |
| 56 | 55 | |
| 57 | - // 查询插入的数据 | |
| 58 | - SysLoginLogDO sysLoginLogDO = loginLogMapper.selectOne("trace_id", traceId); | |
| 59 | - | |
| 60 | 56 | // 断言,忽略基本字段 |
| 61 | - assertPojoEquals( | |
| 62 | - SysLoginLogConvert.INSTANCE.convert(reqVO), | |
| 63 | - sysLoginLogDO, | |
| 64 | - getBaseDOFields() | |
| 65 | - ); | |
| 57 | + SysLoginLogDO sysLoginLogDO = loginLogMapper.selectOne(null); | |
| 58 | + assertPojoEquals(reqVO, sysLoginLogDO); | |
| 66 | 59 | } |
| 67 | 60 | |
| 68 | 61 | |
| ... | ... | @@ -155,17 +148,4 @@ public class SysLoginLogServiceImplTest extends BaseSpringBootUnitTest { |
| 155 | 148 | assertEquals(1, loginLogList.size()); |
| 156 | 149 | assertPojoEquals(loginLogDO, loginLogList.get(0)); |
| 157 | 150 | } |
| 158 | - | |
| 159 | - | |
| 160 | - private static String[] getBaseDOFields() { | |
| 161 | - Field[] fields = ReflectUtil.getFields(BaseDO.class); | |
| 162 | - | |
| 163 | - List<String> collect = Arrays.stream(fields) | |
| 164 | - .map(Field::getName) | |
| 165 | - .collect(Collectors.toList()); | |
| 166 | - collect.add("id"); | |
| 167 | - | |
| 168 | - return ArrayUtil.toArray(collect, String.class); | |
| 169 | - } | |
| 170 | - | |
| 171 | 151 | } | ... | ... |
src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogServiceImplTest.java
| 1 | 1 | package cn.iocoder.dashboard.modules.system.service.logger; |
| 2 | 2 | |
| 3 | +import cn.hutool.core.map.MapUtil; | |
| 3 | 4 | import cn.hutool.core.util.ArrayUtil; |
| 4 | 5 | import cn.hutool.core.util.RandomUtil; |
| 5 | 6 | import cn.hutool.core.util.ReflectUtil; |
| 6 | -import cn.iocoder.dashboard.BaseSpringBootUnitTest; | |
| 7 | +import cn.iocoder.dashboard.BaseDbUnitTest; | |
| 7 | 8 | import cn.iocoder.dashboard.common.enums.CommonStatusEnum; |
| 8 | 9 | import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants; |
| 9 | 10 | import cn.iocoder.dashboard.common.pojo.PageResult; |
| ... | ... | @@ -13,15 +14,18 @@ import cn.iocoder.dashboard.framework.tracer.core.util.TracerUtils; |
| 13 | 14 | import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogCreateReqVO; |
| 14 | 15 | import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; |
| 15 | 16 | import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; |
| 16 | -import cn.iocoder.dashboard.modules.system.convert.logger.SysOperateLogConvert; | |
| 17 | 17 | import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysOperateLogDO; |
| 18 | 18 | import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; |
| 19 | 19 | import cn.iocoder.dashboard.modules.system.dal.mysql.logger.SysOperateLogMapper; |
| 20 | 20 | import cn.iocoder.dashboard.modules.system.dal.mysql.user.SysUserMapper; |
| 21 | 21 | import cn.iocoder.dashboard.modules.system.enums.common.SysSexEnum; |
| 22 | +import cn.iocoder.dashboard.modules.system.service.logger.impl.SysOperateLogServiceImpl; | |
| 23 | +import cn.iocoder.dashboard.modules.system.service.user.SysUserService; | |
| 22 | 24 | import cn.iocoder.dashboard.util.RandomUtils; |
| 23 | 25 | import cn.iocoder.dashboard.util.object.ObjectUtils; |
| 24 | 26 | import org.junit.jupiter.api.Test; |
| 27 | +import org.springframework.boot.test.mock.mockito.MockBean; | |
| 28 | +import org.springframework.context.annotation.Import; | |
| 25 | 29 | |
| 26 | 30 | import javax.annotation.Resource; |
| 27 | 31 | import java.lang.reflect.Field; |
| ... | ... | @@ -29,6 +33,8 @@ import java.util.Arrays; |
| 29 | 33 | import java.util.HashMap; |
| 30 | 34 | import java.util.List; |
| 31 | 35 | import java.util.Map; |
| 36 | +import java.util.concurrent.ExecutionException; | |
| 37 | +import java.util.concurrent.Future; | |
| 32 | 38 | import java.util.stream.Collectors; |
| 33 | 39 | |
| 34 | 40 | import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; |
| ... | ... | @@ -36,7 +42,8 @@ import static cn.iocoder.dashboard.util.date.DateUtils.buildTime; |
| 36 | 42 | import static org.junit.jupiter.api.Assertions.assertEquals; |
| 37 | 43 | import static org.junit.jupiter.api.Assertions.assertNotNull; |
| 38 | 44 | |
| 39 | -public class SysOperateLogServiceImplTest extends BaseSpringBootUnitTest { | |
| 45 | +@Import({SysOperateLogServiceImpl.class}) | |
| 46 | +public class SysOperateLogServiceImplTest extends BaseDbUnitTest { | |
| 40 | 47 | |
| 41 | 48 | @Resource |
| 42 | 49 | private SysOperateLogService sysOperateLogServiceImpl; |
| ... | ... | @@ -47,24 +54,26 @@ public class SysOperateLogServiceImplTest extends BaseSpringBootUnitTest { |
| 47 | 54 | @Resource |
| 48 | 55 | private SysUserMapper sysUserMapper; |
| 49 | 56 | |
| 57 | + @MockBean | |
| 58 | + private SysUserService sysUserService; | |
| 59 | + | |
| 50 | 60 | @Test |
| 51 | - public void testCreateOperateLogAsync() throws InterruptedException { | |
| 61 | + public void testCreateOperateLogAsync() throws InterruptedException, ExecutionException { | |
| 52 | 62 | |
| 53 | 63 | String traceId = TracerUtils.getTraceId(); |
| 54 | 64 | SysOperateLogCreateReqVO reqVO = RandomUtils.randomPojo(SysOperateLogCreateReqVO.class, vo -> { |
| 55 | 65 | vo.setTraceId(traceId); |
| 56 | 66 | vo.setUserId(RandomUtil.randomLong(1, Long.MAX_VALUE)); |
| 57 | 67 | |
| 58 | - Map<String, Object> map = new HashMap<>(); | |
| 59 | - map.put("orderId", 1); | |
| 68 | + Map<String, Object> map = MapUtil.builder("orderId", (Object) 1).build(); | |
| 60 | 69 | vo.setExts(map); |
| 61 | 70 | }); |
| 62 | 71 | |
| 63 | 72 | // 执行service方法 |
| 64 | - sysOperateLogServiceImpl.createOperateLogAsync(reqVO); | |
| 73 | + Future<Boolean> future = sysOperateLogServiceImpl.createOperateLogAsync(reqVO); | |
| 65 | 74 | |
| 66 | 75 | // 等异步执行完 |
| 67 | - Thread.sleep(2000); | |
| 76 | + future.get(); | |
| 68 | 77 | |
| 69 | 78 | // 查询插入的数据 |
| 70 | 79 | SysOperateLogDO sysOperateLogDO = sysOperateLogMapper.selectOne("trace_id", traceId); |
| ... | ... | @@ -72,11 +81,7 @@ public class SysOperateLogServiceImplTest extends BaseSpringBootUnitTest { |
| 72 | 81 | // 断言 |
| 73 | 82 | assertNotNull(sysOperateLogDO); |
| 74 | 83 | // 断言,忽略基本字段 |
| 75 | - assertPojoEquals( | |
| 76 | - SysOperateLogConvert.INSTANCE.convert(reqVO), | |
| 77 | - sysOperateLogDO, | |
| 78 | - getBaseDOFields() | |
| 79 | - ); | |
| 84 | + assertPojoEquals(reqVO, sysOperateLogDO); | |
| 80 | 85 | } |
| 81 | 86 | |
| 82 | 87 | |
| ... | ... | @@ -165,8 +170,8 @@ public class SysOperateLogServiceImplTest extends BaseSpringBootUnitTest { |
| 165 | 170 | entity.setStartTime(buildTime(2021, 3, 6)); |
| 166 | 171 | entity.setResultCode(GlobalErrorCodeConstants.SUCCESS.getCode()); |
| 167 | 172 | |
| 168 | - Map<String, Object> map = new HashMap<>(); | |
| 169 | - map.put("orderId", 1); | |
| 173 | + | |
| 174 | + Map<String, Object> map = MapUtil.builder("orderId", (Object) 1).build(); | |
| 170 | 175 | entity.setExts(map); |
| 171 | 176 | }); |
| 172 | 177 | |
| ... | ... | @@ -200,17 +205,4 @@ public class SysOperateLogServiceImplTest extends BaseSpringBootUnitTest { |
| 200 | 205 | assertEquals(1, list.size()); |
| 201 | 206 | assertPojoEquals(sysOperateLogDO, list.get(0)); |
| 202 | 207 | } |
| 203 | - | |
| 204 | - | |
| 205 | - private static String[] getBaseDOFields() { | |
| 206 | - Field[] fields = ReflectUtil.getFields(BaseDO.class); | |
| 207 | - | |
| 208 | - List<String> collect = Arrays.stream(fields) | |
| 209 | - .map(Field::getName) | |
| 210 | - .collect(Collectors.toList()); | |
| 211 | - collect.add("id"); | |
| 212 | - | |
| 213 | - return ArrayUtil.toArray(collect, String.class); | |
| 214 | - } | |
| 215 | - | |
| 216 | 208 | } | ... | ... |
src/test/resources/sql/create_tables.sql
| ... | ... | @@ -170,9 +170,9 @@ CREATE TABLE IF NOT EXISTS `sys_login_log` ( |
| 170 | 170 | `result` tinyint(4) NOT NULL, |
| 171 | 171 | `user_ip` varchar(50) NOT NULL, |
| 172 | 172 | `user_agent` varchar(512) NOT NULL, |
| 173 | - `create_by` varchar(64) DEFAULT '', | |
| 173 | + `creator` varchar(64) DEFAULT '', | |
| 174 | 174 | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| 175 | - `update_by` varchar(64) DEFAULT '', | |
| 175 | + `updater` varchar(64) DEFAULT '', | |
| 176 | 176 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, |
| 177 | 177 | `deleted` bit(1) NOT NULL DEFAULT '0', |
| 178 | 178 | PRIMARY KEY (`id`) |
| ... | ... | @@ -199,9 +199,9 @@ CREATE TABLE `sys_operate_log` ( |
| 199 | 199 | `result_code` int(11) NOT NULL DEFAULT '0', |
| 200 | 200 | `result_msg` varchar(512) DEFAULT '', |
| 201 | 201 | `result_data` varchar(4000) DEFAULT '', |
| 202 | - `create_by` varchar(64) DEFAULT '', | |
| 202 | + `creator` varchar(64) DEFAULT '', | |
| 203 | 203 | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| 204 | - `update_by` varchar(64) DEFAULT '', | |
| 204 | + `updater` varchar(64) DEFAULT '', | |
| 205 | 205 | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, |
| 206 | 206 | `deleted` bit(1) NOT NULL DEFAULT '0', |
| 207 | 207 | PRIMARY KEY (`id`) |
| ... | ... | @@ -222,9 +222,9 @@ create table "sys_user" ( |
| 222 | 222 | "status" tinyint not null default '0', |
| 223 | 223 | "login_ip" varchar(50) default '', |
| 224 | 224 | "login_date" timestamp default null, |
| 225 | - "create_by" varchar(64) default '', | |
| 225 | + "creator" varchar(64) default '', | |
| 226 | 226 | "create_time" timestamp not null default current_timestamp, |
| 227 | - "update_by" varchar(64) default '', | |
| 227 | + "updater" varchar(64) default '', | |
| 228 | 228 | "update_time" timestamp not null default current_timestamp, |
| 229 | 229 | "deleted" bit not null default false, |
| 230 | 230 | primary key ("id") | ... | ... |