Commit c197417d92d7ebe0038f08bd393b867ab40f3b66

Authored by wangkai
1 parent 75d21928

修改 system logger junit review 后提出的问题

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 &quot;sys_user&quot; (
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")
... ...