Commit 81e7e046801efdeb0de8d44c56fd1a23a4b0e60f

Authored by YunaiV
1 parent f6761537

完成部分 SysUserServiceImplTest 单元测试

... ... @@ -46,7 +46,12 @@
46 46 <easyexcel.verion>2.2.7</easyexcel.verion>
47 47 <velocity.version>2.2</velocity.version>
48 48 <screw.version>1.0.5</screw.version>
  49 + <podam.version>7.2.6.RELEASE</podam.version>
  50 + <jedis-mock.version>0.1.16</jedis-mock.version>
49 51 <!-- 三方云服务相关 -->
  52 + <aliyun-java-sdk-core.version>4.5.18</aliyun-java-sdk-core.version>
  53 + <aliyun-java-sdk-dysmsapi.version>2.1.0</aliyun-java-sdk-dysmsapi.version>
  54 + <yunpian-java-sdk.version>1.2.7</yunpian-java-sdk.version>
50 55 </properties>
51 56  
52 57 <!-- 依赖声明 -->
... ... @@ -213,14 +218,14 @@
213 218 <dependency>
214 219 <groupId>com.github.fppt</groupId> <!-- 单元测试,我们采用内嵌的 Redis 数据库 -->
215 220 <artifactId>jedis-mock</artifactId>
216   - <version>0.1.16</version>
  221 + <version>${jedis-mock.version}</version>
217 222 <scope>test</scope>
218 223 </dependency>
219 224  
220 225 <dependency>
221 226 <groupId>uk.co.jemos.podam</groupId> <!-- 单元测试,随机生成 POJO 类 -->
222 227 <artifactId>podam</artifactId>
223   - <version>7.2.6.RELEASE</version>
  228 + <version>${podam.version}</version>
224 229 <scope>test</scope>
225 230 </dependency>
226 231  
... ... @@ -278,18 +283,18 @@
278 283 <dependency>
279 284 <groupId>com.yunpian.sdk</groupId>
280 285 <artifactId>yunpian-java-sdk</artifactId>
281   - <version>1.2.7</version>
  286 + <version>${yunpian-java-sdk.version}</version>
282 287 </dependency>
283 288  
284 289 <dependency>
285 290 <groupId>com.aliyun</groupId>
286 291 <artifactId>aliyun-java-sdk-core</artifactId>
287   - <version>4.5.18</version>
  292 + <version>${aliyun-java-sdk-core.version}</version>
288 293 </dependency>
289 294 <dependency>
290 295 <groupId>com.aliyun</groupId>
291 296 <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
292   - <version>2.1.0</version>
  297 + <version>${aliyun-java-sdk-dysmsapi.version}</version>
293 298 </dependency>
294 299 <!-- SMS SDK end -->
295 300  
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserController.java
... ... @@ -149,9 +149,9 @@ public class SysUserController {
149 149 // 手动创建导出 demo
150 150 List<SysUserImportExcelVO> list = Arrays.asList(
151 151 SysUserImportExcelVO.builder().username("yudao").deptId(1L).email("yudao@iocoder.cn").mobile("15601691300")
152   - .nickname("芋道").status(CommonStatusEnum.ENABLE.getStatus()).sex(SysSexEnum.MALE.getSEX()).build(),
  152 + .nickname("芋道").status(CommonStatusEnum.ENABLE.getStatus()).sex(SysSexEnum.MALE.getSex()).build(),
153 153 SysUserImportExcelVO.builder().username("yuanma").deptId(2L).email("yuanma@iocoder.cn").mobile("15601701300")
154   - .nickname("源码").status(CommonStatusEnum.DISABLE.getStatus()).sex(SysSexEnum.FEMALE.getSEX()).build()
  154 + .nickname("源码").status(CommonStatusEnum.DISABLE.getStatus()).sex(SysSexEnum.FEMALE.getSex()).build()
155 155 );
156 156  
157 157 // 输出
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/profile/SysUserProfileUpdateReqVO.java
... ... @@ -3,9 +3,9 @@ package cn.iocoder.dashboard.modules.system.controller.user.vo.profile;
3 3 import io.swagger.annotations.ApiModel;
4 4 import io.swagger.annotations.ApiModelProperty;
5 5 import lombok.Data;
  6 +import org.hibernate.validator.constraints.Length;
6 7  
7 8 import javax.validation.constraints.Email;
8   -import javax.validation.constraints.Pattern;
9 9 import javax.validation.constraints.Size;
10 10  
11 11 @ApiModel("用户个人信息更新 Request VO")
... ... @@ -22,7 +22,7 @@ public class SysUserProfileUpdateReqVO {
22 22 private String email;
23 23  
24 24 @ApiModelProperty(value = "手机号码", example = "15601691300")
25   - @Pattern(regexp = "^1(3|4|5|7|8)\\d{9}$",message = "手机号码格式错误")
  25 + @Length(min = 11, max = 11, message = "手机号长度必须 11 位")
26 26 private String mobile;
27 27  
28 28 @ApiModelProperty(value = "用户性别", example = "1", notes = "参见 SysSexEnum 枚举类")
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserBaseVO.java
... ... @@ -2,10 +2,10 @@ package cn.iocoder.dashboard.modules.system.controller.user.vo.user;
2 2  
3 3 import io.swagger.annotations.ApiModelProperty;
4 4 import lombok.Data;
  5 +import org.hibernate.validator.constraints.Length;
5 6  
6 7 import javax.validation.constraints.Email;
7 8 import javax.validation.constraints.NotBlank;
8   -import javax.validation.constraints.Pattern;
9 9 import javax.validation.constraints.Size;
10 10 import java.util.Set;
11 11  
... ... @@ -40,7 +40,7 @@ public class SysUserBaseVO {
40 40 private String email;
41 41  
42 42 @ApiModelProperty(value = "手机号码", example = "15601691300")
43   - @Pattern(regexp = "^1(3|4|5|7|8)\\d{9}$",message = "手机号码格式错误")
  43 + @Length(min = 11, max = 11, message = "手机号长度必须 11 位")
44 44 private String mobile;
45 45  
46 46 @ApiModelProperty(value = "用户性别", example = "1", notes = "参见 SysSexEnum 枚举类")
... ...
src/main/java/cn/iocoder/dashboard/modules/system/enums/common/SysSexEnum.java
... ... @@ -3,6 +3,11 @@ package cn.iocoder.dashboard.modules.system.enums.common;
3 3 import lombok.AllArgsConstructor;
4 4 import lombok.Getter;
5 5  
  6 +/**
  7 + * 性别的枚举值
  8 + *
  9 + * @author 芋道源码
  10 + */
6 11 @Getter
7 12 @AllArgsConstructor
8 13 public enum SysSexEnum {
... ... @@ -10,6 +15,9 @@ public enum SysSexEnum {
10 15 MALE(1), // 男
11 16 FEMALE(2); // 女
12 17  
13   - private final Integer SEX;
  18 + /**
  19 + * 性别
  20 + */
  21 + private final Integer sex;
14 22  
15 23 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java
... ... @@ -6,17 +6,11 @@ import cn.hutool.core.util.IdUtil;
6 6 import cn.hutool.core.util.StrUtil;
7 7 import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
8 8 import cn.iocoder.dashboard.common.exception.ServiceException;
9   -import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil;
10 9 import cn.iocoder.dashboard.common.pojo.PageResult;
11 10 import cn.iocoder.dashboard.modules.infra.service.file.InfFileService;
12 11 import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO;
13 12 import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO;
14   -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO;
15   -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExportReqVO;
16   -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportExcelVO;
17   -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportRespVO;
18   -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO;
19   -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO;
  13 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.*;
20 14 import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert;
21 15 import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO;
22 16 import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO;
... ... @@ -33,14 +27,9 @@ import org.springframework.transaction.annotation.Transactional;
33 27  
34 28 import javax.annotation.Resource;
35 29 import java.io.InputStream;
36   -import java.util.ArrayList;
37   -import java.util.Collection;
38   -import java.util.Collections;
39   -import java.util.LinkedHashMap;
40   -import java.util.List;
41   -import java.util.Map;
42   -import java.util.Set;
  30 +import java.util.*;
43 31  
  32 +import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception;
44 33 import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
45 34  
46 35  
... ... @@ -142,8 +131,6 @@ public class SysUserServiceImpl implements SysUserService {
142 131 updateObj.setId(id);
143 132 updateObj.setStatus(status);
144 133 userMapper.updateById(updateObj);
145   - // 删除用户关联数据
146   - permissionService.processUserDeleted(id);
147 134 }
148 135  
149 136 @Override
... ... @@ -152,6 +139,8 @@ public class SysUserServiceImpl implements SysUserService {
152 139 this.checkUserExists(id);
153 140 // 删除用户
154 141 userMapper.deleteById(id);
  142 + // 删除用户关联数据
  143 + permissionService.processUserDeleted(id);
155 144 }
156 145  
157 146 @Override
... ... @@ -227,7 +216,7 @@ public class SysUserServiceImpl implements SysUserService {
227 216 }
228 217 SysUserDO user = userMapper.selectById(id);
229 218 if (user == null) {
230   - throw ServiceExceptionUtil.exception(USER_NOT_EXISTS);
  219 + throw exception(USER_NOT_EXISTS);
231 220 }
232 221 }
233 222  
... ... @@ -241,10 +230,10 @@ public class SysUserServiceImpl implements SysUserService {
241 230 }
242 231 // 如果 id 为空,说明不用比较是否为相同 id 的用户
243 232 if (id == null) {
244   - throw ServiceExceptionUtil.exception(USER_USERNAME_EXISTS);
  233 + throw exception(USER_USERNAME_EXISTS);
245 234 }
246 235 if (!user.getId().equals(id)) {
247   - throw ServiceExceptionUtil.exception(USER_USERNAME_EXISTS);
  236 + throw exception(USER_USERNAME_EXISTS);
248 237 }
249 238 }
250 239  
... ... @@ -258,10 +247,10 @@ public class SysUserServiceImpl implements SysUserService {
258 247 }
259 248 // 如果 id 为空,说明不用比较是否为相同 id 的用户
260 249 if (id == null) {
261   - throw ServiceExceptionUtil.exception(USER_EMAIL_EXISTS);
  250 + throw exception(USER_EMAIL_EXISTS);
262 251 }
263 252 if (!user.getId().equals(id)) {
264   - throw ServiceExceptionUtil.exception(USER_EMAIL_EXISTS);
  253 + throw exception(USER_EMAIL_EXISTS);
265 254 }
266 255 }
267 256  
... ... @@ -275,10 +264,10 @@ public class SysUserServiceImpl implements SysUserService {
275 264 }
276 265 // 如果 id 为空,说明不用比较是否为相同 id 的用户
277 266 if (id == null) {
278   - throw ServiceExceptionUtil.exception(USER_MOBILE_EXISTS);
  267 + throw exception(USER_MOBILE_EXISTS);
279 268 }
280 269 if (!user.getId().equals(id)) {
281   - throw ServiceExceptionUtil.exception(USER_MOBILE_EXISTS);
  270 + throw exception(USER_MOBILE_EXISTS);
282 271 }
283 272 }
284 273  
... ... @@ -288,10 +277,10 @@ public class SysUserServiceImpl implements SysUserService {
288 277 }
289 278 SysDeptDO dept = deptService.getDept(deptId);
290 279 if (dept == null) {
291   - throw ServiceExceptionUtil.exception(DEPT_NOT_FOUND);
  280 + throw exception(DEPT_NOT_FOUND);
292 281 }
293 282 if (!CommonStatusEnum.ENABLE.getStatus().equals(dept.getStatus())) {
294   - throw ServiceExceptionUtil.exception(DEPT_NOT_ENABLE);
  283 + throw exception(DEPT_NOT_ENABLE);
295 284 }
296 285 }
297 286  
... ... @@ -301,16 +290,16 @@ public class SysUserServiceImpl implements SysUserService {
301 290 }
302 291 List<SysPostDO> posts = postService.getPosts(postIds, null);
303 292 if (CollUtil.isEmpty(posts)) {
304   - throw ServiceExceptionUtil.exception(POST_NOT_FOUND);
  293 + throw exception(POST_NOT_FOUND);
305 294 }
306 295 Map<Long, SysPostDO> postMap = CollectionUtils.convertMap(posts, SysPostDO::getId);
307 296 postIds.forEach(postId -> {
308 297 SysPostDO post = postMap.get(postId);
309 298 if (post == null) {
310   - throw ServiceExceptionUtil.exception(POST_NOT_FOUND);
  299 + throw exception(POST_NOT_FOUND);
311 300 }
312 301 if (!CommonStatusEnum.ENABLE.getStatus().equals(post.getStatus())) {
313   - throw ServiceExceptionUtil.exception(POST_NOT_ENABLE, post.getName());
  302 + throw exception(POST_NOT_ENABLE, post.getName());
314 303 }
315 304 });
316 305 }
... ... @@ -324,10 +313,10 @@ public class SysUserServiceImpl implements SysUserService {
324 313 private void checkOldPassword(Long id, String oldPassword) {
325 314 SysUserDO user = userMapper.selectById(id);
326 315 if (user == null) {
327   - throw ServiceExceptionUtil.exception(USER_NOT_EXISTS);
  316 + throw exception(USER_NOT_EXISTS);
328 317 }
329 318 if (!passwordEncoder.matches(oldPassword, user.getPassword())) {
330   - throw ServiceExceptionUtil.exception(USER_PASSWORD_FAILED);
  319 + throw exception(USER_PASSWORD_FAILED);
331 320 }
332 321 }
333 322  
... ... @@ -335,7 +324,7 @@ public class SysUserServiceImpl implements SysUserService {
335 324 @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入
336 325 public SysUserImportRespVO importUsers(List<SysUserImportExcelVO> importUsers, boolean isUpdateSupport) {
337 326 if (CollUtil.isEmpty(importUsers)) {
338   - throw ServiceExceptionUtil.exception(USER_IMPORT_LIST_IS_EMPTY);
  327 + throw exception(USER_IMPORT_LIST_IS_EMPTY);
339 328 }
340 329 SysUserImportRespVO respVO = SysUserImportRespVO.builder().createUsernames(new ArrayList<>())
341 330 .updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build();
... ...
src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysUserSessionServiceImplTest.java
1 1 package cn.iocoder.dashboard.modules.system.service.auth;
2 2  
3 3 import static cn.hutool.core.util.RandomUtil.randomEle;
4   -import static cn.iocoder.dashboard.modules.system.dal.redis.SysRedisKeyConstants.LOGIN_USER;
5 4 import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals;
6 5 import static cn.iocoder.dashboard.util.RandomUtils.randomDate;
7 6 import static cn.iocoder.dashboard.util.RandomUtils.randomLongId;
... ... @@ -25,7 +24,6 @@ import javax.annotation.Resource;
25 24 import org.junit.jupiter.api.Test;
26 25 import org.springframework.boot.test.mock.mockito.MockBean;
27 26 import org.springframework.context.annotation.Import;
28   -import org.springframework.data.redis.core.StringRedisTemplate;
29 27  
30 28 import cn.hutool.core.date.DateUtil;
31 29 import cn.iocoder.dashboard.BaseDbAndRedisUnitTest;
... ... @@ -33,10 +31,6 @@ import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
33 31 import cn.iocoder.dashboard.common.pojo.PageResult;
34 32 import cn.iocoder.dashboard.framework.security.config.SecurityProperties;
35 33 import cn.iocoder.dashboard.framework.security.core.LoginUser;
36   -import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobPageReqVO;
37   -import cn.iocoder.dashboard.modules.infra.dal.dataobject.job.InfJobDO;
38   -import cn.iocoder.dashboard.modules.infra.enums.config.InfConfigTypeEnum;
39   -import cn.iocoder.dashboard.modules.infra.enums.job.InfJobStatusEnum;
40 34 import cn.iocoder.dashboard.modules.system.controller.auth.vo.session.SysUserSessionPageReqVO;
41 35 import cn.iocoder.dashboard.modules.system.dal.dataobject.auth.SysUserSessionDO;
42 36 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO;
... ... @@ -50,7 +44,6 @@ import cn.iocoder.dashboard.modules.system.service.logger.impl.SysLoginLogServic
50 44 import cn.iocoder.dashboard.modules.system.service.user.SysUserServiceImpl;
51 45 import cn.iocoder.dashboard.util.AssertUtils;
52 46 import cn.iocoder.dashboard.util.RandomUtils;
53   -import cn.iocoder.dashboard.util.json.JsonUtils;
54 47 import cn.iocoder.dashboard.util.object.ObjectUtils;
55 48  
56 49 /**
... ... @@ -167,12 +160,12 @@ public class SysUserSessionServiceImplTest extends BaseDbAndRedisUnitTest {
167 160 String userIp = randomString();
168 161 SysUserDO dbUser1 = randomPojo(SysUserDO.class, o -> {
169 162 o.setUsername("testUsername1");
170   - o.setSex(randomEle(SysSexEnum.values()).getSEX());
  163 + o.setSex(randomEle(SysSexEnum.values()).getSex());
171 164 o.setStatus(CommonStatusEnum.ENABLE.getStatus());
172 165 });
173 166 SysUserDO dbUser2 = randomPojo(SysUserDO.class, o -> {
174 167 o.setUsername("testUsername2");
175   - o.setSex(randomEle(SysSexEnum.values()).getSEX());
  168 + o.setSex(randomEle(SysSexEnum.values()).getSex());
176 169 o.setStatus(CommonStatusEnum.ENABLE.getStatus());
177 170 });
178 171 SysUserSessionDO dbSession = randomPojo(SysUserSessionDO.class, o -> {
... ...
src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogServiceImplTest.java
... ... @@ -68,7 +68,7 @@ public class SysOperateLogServiceImplTest extends BaseDbUnitTest {
68 68 // 先构造用户
69 69 SysUserDO user = RandomUtils.randomPojo(SysUserDO.class, o -> {
70 70 o.setNickname("wangkai");
71   - o.setSex(SysSexEnum.MALE.getSEX());
  71 + o.setSex(SysSexEnum.MALE.getSex());
72 72 o.setStatus(CommonStatusEnum.ENABLE.getStatus());
73 73 });
74 74 when(userService.getUsersByNickname("wangkai")).thenReturn(Collections.singletonList(user));
... ... @@ -119,7 +119,7 @@ public class SysOperateLogServiceImplTest extends BaseDbUnitTest {
119 119 // 先构造用户
120 120 SysUserDO user = RandomUtils.randomPojo(SysUserDO.class, o -> {
121 121 o.setNickname("wangkai");
122   - o.setSex(SysSexEnum.MALE.getSEX());
  122 + o.setSex(SysSexEnum.MALE.getSex());
123 123 o.setStatus(CommonStatusEnum.ENABLE.getStatus());
124 124 });
125 125 when(userService.getUsersByNickname("wangkai")).thenReturn(Collections.singletonList(user));
... ...
src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelServiceTest.java
... ... @@ -56,7 +56,7 @@ public class SysSmsChannelServiceTest extends BaseDbUnitTest {
56 56  
57 57 @Test
58 58 public void testInitLocalCache_success() {
59   - // mock 数据s
  59 + // mock 数据
60 60 SysSmsChannelDO smsChannelDO01 = randomSmsChannelDO();
61 61 smsChannelMapper.insert(smsChannelDO01);
62 62 SysSmsChannelDO smsChannelDO02 = randomSmsChannelDO();
... ...
src/test/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImplTest.java
1 1 package cn.iocoder.dashboard.modules.system.service.user;
2 2  
3 3 import cn.hutool.core.util.RandomUtil;
4   -import cn.iocoder.dashboard.BaseSpringBootUnitTest;
  4 +import cn.iocoder.dashboard.BaseDbUnitTest;
5 5 import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
  6 +import cn.iocoder.dashboard.modules.infra.service.file.InfFileService;
  7 +import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO;
  8 +import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO;
6 9 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO;
7 10 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportExcelVO;
8 11 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportRespVO;
9 12 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO;
10 13 import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO;
11   -import cn.iocoder.dashboard.modules.system.dal.mysql.dept.SysDeptMapper;
  14 +import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO;
  15 +import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO;
  16 +import cn.iocoder.dashboard.modules.system.dal.mysql.user.SysUserMapper;
  17 +import cn.iocoder.dashboard.modules.system.enums.common.SysSexEnum;
12 18 import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService;
13   -import cn.iocoder.dashboard.util.RandomUtils;
  19 +import cn.iocoder.dashboard.modules.system.service.dept.SysPostService;
  20 +import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
  21 +import cn.iocoder.dashboard.util.collection.ArrayUtils;
  22 +import cn.iocoder.dashboard.util.collection.CollectionUtils;
14 23 import org.junit.jupiter.api.Test;
15   -import org.springframework.beans.factory.annotation.Autowired;
  24 +import org.mockito.stubbing.Answer;
  25 +import org.springframework.boot.test.mock.mockito.MockBean;
16 26 import org.springframework.context.annotation.Import;
17 27 import org.springframework.security.crypto.password.PasswordEncoder;
18 28  
19 29 import javax.annotation.Resource;
  30 +import java.io.ByteArrayInputStream;
20 31 import java.util.ArrayList;
21   -import java.util.Collections;
22 32 import java.util.List;
  33 +import java.util.function.Consumer;
23 34  
24   -import static cn.iocoder.dashboard.util.RandomUtils.randomPojo;
25   -import static cn.iocoder.dashboard.util.RandomUtils.randomString;
26   -import static org.junit.jupiter.api.Assertions.*;
  35 +import static cn.hutool.core.util.RandomUtil.randomBytes;
  36 +import static cn.hutool.core.util.RandomUtil.randomEle;
  37 +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals;
  38 +import static cn.iocoder.dashboard.util.RandomUtils.*;
  39 +import static org.junit.jupiter.api.Assertions.assertEquals;
  40 +import static org.junit.jupiter.api.Assertions.assertNull;
  41 +import static org.mockito.ArgumentMatchers.*;
  42 +import static org.mockito.Mockito.*;
27 43  
28 44 /**
29   - * @Author zxl
30   - * @Date 2021/3/6 14:28
31   - * @Desc
  45 + * {@link SysUserService} 的单元测试类
  46 + *
  47 + * @author zxl
32 48 */
33   -@Import(PasswordEncoder.class)
34   -public class SysUserServiceImplTest extends BaseSpringBootUnitTest {
  49 +@Import(SysUserServiceImpl.class)
  50 +public class SysUserServiceImplTest extends BaseDbUnitTest {
  51 +
  52 + @Resource
  53 + private SysUserServiceImpl userService;
35 54  
36   - @Autowired
37   - private SysUserService userService;
38   - @Autowired
39   - private PasswordEncoder passwordEncoder;
40   - @Autowired
41   - private SysDeptService deptService;
42 55 @Resource
43   - private SysDeptMapper deptMapper;
  56 + private SysUserMapper userMapper;
44 57  
  58 + @MockBean
  59 + private SysDeptService deptService;
  60 + @MockBean
  61 + private SysPostService postService;
  62 + @MockBean
  63 + private SysPermissionService permissionService;
  64 + @MockBean
  65 + private PasswordEncoder passwordEncoder;
  66 + @MockBean
  67 + private InfFileService fileService;
45 68  
46 69 @Test
47   - public void test_creatUser(){
  70 + public void testCreatUser_success() {
48 71 // 准备参数
49   - SysUserCreateReqVO reqVO = randomPojo(SysUserCreateReqVO.class,o->{
50   - o.setDeptId(null);
51   - o.setPostIds(Collections.emptySet());
52   - o.setSex(1);
53   - o.setPassword(randomString());
  72 + SysUserCreateReqVO reqVO = randomPojo(SysUserCreateReqVO.class, o -> {
  73 + o.setSex(RandomUtil.randomEle(SysSexEnum.values()).getSex());
  74 + o.setMobile(randomString());
54 75 });
55   - // 调用方法
56   - Long userId = userService.createUser(reqVO);
57   - // 校验数据是否存在
58   - assertNotNull(userService.getUser(userId));
  76 + // mock deptService 的方法
  77 + SysDeptDO dept = randomPojo(SysDeptDO.class, o -> {
  78 + o.setId(reqVO.getDeptId());
  79 + o.setStatus(CommonStatusEnum.ENABLE.getStatus());
  80 + });
  81 + when(deptService.getDept(eq(dept.getId()))).thenReturn(dept);
  82 + // mock postService 的方法
  83 + List<SysPostDO> posts = CollectionUtils.convertList(reqVO.getPostIds(), postId ->
  84 + randomPojo(SysPostDO.class, o -> {
  85 + o.setId(postId);
  86 + o.setStatus(CommonStatusEnum.ENABLE.getStatus());
  87 + }));
  88 + when(postService.getPosts(eq(reqVO.getPostIds()), isNull())).thenReturn(posts);
  89 + // mock passwordEncoder 的方法
  90 + when(passwordEncoder.encode(eq(reqVO.getPassword()))).thenReturn("yudaoyuanma");
  91 +
  92 + // 调用
  93 + Long userId = userService.createUser(reqVO);
  94 + // 断言
  95 + SysUserDO user = userMapper.selectById(userId);
  96 + assertPojoEquals(reqVO, user, "password");
  97 + assertEquals("yudaoyuanma", user.getPassword());
  98 + assertEquals(CommonStatusEnum.ENABLE.getStatus(), user.getStatus());
59 99 }
60 100  
61 101 @Test
62   - public void test_updateUser(){
  102 + public void testUpdateUser_success() {
  103 + // mock 数据
  104 + SysUserDO dbUser = randomSysUserDO();
  105 + userMapper.insert(dbUser);
63 106 // 准备参数
64   - SysUserCreateReqVO reqVO = randomPojo(SysUserCreateReqVO.class,o->{
65   - o.setDeptId(null);
66   - o.setPostIds(Collections.emptySet());
67   - o.setSex(1);
68   - o.setPassword(randomString());
  107 + SysUserUpdateReqVO reqVO = randomPojo(SysUserUpdateReqVO.class, o -> {
  108 + o.setId(dbUser.getId());
  109 + o.setSex(RandomUtil.randomEle(SysSexEnum.values()).getSex());
  110 + o.setMobile(randomString());
69 111 });
70   - // 先插入一条
71   - Long userId = userService.createUser(reqVO);
72   - // 准备更新参数:更新手机号
73   - SysUserUpdateReqVO updateVo = new SysUserUpdateReqVO();
74   - updateVo.setId(userId);
75   - updateVo.setMobile(RandomUtil.randomNumbers(11));
76   - // 调用方法、
77   - userService.updateUser(updateVo);
78   - // 校验结果
79   - assertEquals(userService.getUser(userId).getMobile(),updateVo.getMobile());
  112 + // mock deptService 的方法
  113 + SysDeptDO dept = randomPojo(SysDeptDO.class, o -> {
  114 + o.setId(reqVO.getDeptId());
  115 + o.setStatus(CommonStatusEnum.ENABLE.getStatus());
  116 + });
  117 + when(deptService.getDept(eq(dept.getId()))).thenReturn(dept);
  118 + // mock postService 的方法
  119 + List<SysPostDO> posts = CollectionUtils.convertList(reqVO.getPostIds(), postId ->
  120 + randomPojo(SysPostDO.class, o -> {
  121 + o.setId(postId);
  122 + o.setStatus(CommonStatusEnum.ENABLE.getStatus());
  123 + }));
  124 + when(postService.getPosts(eq(reqVO.getPostIds()), isNull())).thenReturn(posts);
80 125  
  126 + // 调用
  127 + userService.updateUser(reqVO);
  128 + // 断言
  129 + SysUserDO user = userMapper.selectById(reqVO.getId());
  130 + assertPojoEquals(reqVO, user);
81 131 }
82 132  
83 133 @Test
84   - public void test_deleteUser(){
  134 + public void testUpdateUserProfile_success() {
  135 + // mock 数据
  136 + SysUserDO dbUser = randomSysUserDO();
  137 + userMapper.insert(dbUser);
85 138 // 准备参数
86   - SysUserCreateReqVO reqVO = randomPojo(SysUserCreateReqVO.class,o->{
87   - o.setDeptId(null);
88   - o.setPostIds(Collections.emptySet());
89   - o.setSex(1);
90   - o.setPassword(randomString());
  139 + Long userId = dbUser.getId();
  140 + SysUserProfileUpdateReqVO reqVO = randomPojo(SysUserProfileUpdateReqVO.class, o -> {
  141 + o.setMobile(randomString());
  142 + o.setSex(RandomUtil.randomEle(SysSexEnum.values()).getSex());
91 143 });
92   - // 先插入一条
93   - Long userId = userService.createUser(reqVO);
94   - // 调用数据
95   - userService.deleteUser(userId);
96   - // 校验结果
97   - assertNull(userService.getUser(userId));
  144 +
  145 + // 调用
  146 + userService.updateUserProfile(userId, reqVO);
  147 + // 断言
  148 + SysUserDO user = userMapper.selectById(userId);
  149 + assertPojoEquals(reqVO, user);
98 150 }
99 151  
100 152 @Test
101   - public void test_updateUserPassword(){
  153 + public void testUpdateUserPassword_success() {
  154 + // mock 数据
  155 + SysUserDO dbUser = randomSysUserDO(o -> o.setPassword("encode:yudao"));
  156 + userMapper.insert(dbUser);
102 157 // 准备参数
103   - SysUserCreateReqVO reqVO = randomPojo(SysUserCreateReqVO.class,o->{
104   - o.setDeptId(null);
105   - o.setPostIds(Collections.emptySet());
106   - o.setSex(1);
107   - o.setPassword("123");
  158 + Long userId = dbUser.getId();
  159 + SysUserProfileUpdatePasswordReqVO reqVO = randomPojo(SysUserProfileUpdatePasswordReqVO.class, o -> {
  160 + o.setOldPassword("yudao");
  161 + o.setNewPassword("yuanma");
108 162 });
109   - // 先插入一条
110   - Long userId = userService.createUser(reqVO);
111   - String newPassword = RandomUtils.randomString();
  163 + // mock 方法
  164 + when(passwordEncoder.encode(anyString())).then(
  165 + (Answer<String>) invocationOnMock -> "encode:" + invocationOnMock.getArgument(0));
  166 + when(passwordEncoder.matches(eq(reqVO.getOldPassword()), eq(dbUser.getPassword()))).thenReturn(true);
  167 +
  168 + // 调用
  169 + userService.updateUserPassword(userId, reqVO);
  170 + // 断言
  171 + SysUserDO user = userMapper.selectById(userId);
  172 + assertEquals("encode:yuanma", user.getPassword());
  173 + }
  174 +
  175 + @Test
  176 + public void testUpdateUserAvatar_success() {
  177 + // mock 数据
  178 + SysUserDO dbUser = randomSysUserDO();
  179 + userMapper.insert(dbUser);
  180 + // 准备参数
  181 + Long userId = dbUser.getId();
  182 + byte[] avatarFileBytes = randomBytes(10);
  183 + ByteArrayInputStream avatarFile = new ByteArrayInputStream(avatarFileBytes);
  184 + // mock 方法
  185 + String avatar = randomString();
  186 + when(fileService.createFile(anyString(), eq(avatarFileBytes))).thenReturn(avatar);
  187 +
  188 + // 调用
  189 + userService.updateUserAvatar(userId, avatarFile);
  190 + // 断言
  191 + SysUserDO user = userMapper.selectById(userId);
  192 + assertEquals(avatar, user.getAvatar());
  193 + }
  194 +
  195 + @Test
  196 + public void testUpdateUserPassword02_success() {
  197 + // mock 数据
  198 + SysUserDO dbUser = randomSysUserDO();
  199 + userMapper.insert(dbUser);
  200 + // 准备参数
  201 + Long userId = dbUser.getId();
  202 + String password = "yudao";
  203 + // mock 方法
  204 + when(passwordEncoder.encode(anyString())).then(
  205 + (Answer<String>) invocationOnMock -> "encode:" + invocationOnMock.getArgument(0));
  206 +
  207 + // 调用
  208 + userService.updateUserPassword(userId, password);
  209 + // 断言
  210 + SysUserDO user = userMapper.selectById(userId);
  211 + assertEquals("encode:" + password, user.getPassword());
  212 + }
  213 +
  214 + @Test
  215 + public void testUpdateUserStatus() {
  216 + // mock 数据
  217 + SysUserDO dbUser = randomSysUserDO();
  218 + userMapper.insert(dbUser);
  219 + // 准备参数
  220 + Long userId = dbUser.getId();
  221 + Integer status = randomCommonStatus();
  222 +
112 223 // 调用
113   - userService.updateUserPassword(userId,newPassword);
  224 + userService.updateUserStatus(userId, status);
  225 + // 断言
  226 + SysUserDO user = userMapper.selectById(userId);
  227 + assertEquals(status, user.getStatus());
  228 + }
  229 +
  230 + @Test
  231 + public void testDeleteUser(){
  232 + // mock 数据
  233 + SysUserDO dbUser = randomSysUserDO();
  234 + userMapper.insert(dbUser);
  235 + // 准备参数
  236 + Long userId = dbUser.getId();
  237 +
  238 + // 调用数据
  239 + userService.deleteUser(userId);
114 240 // 校验结果
115   - assertNotEquals(passwordEncoder.encode(newPassword),userService.getUser(userId).getPassword());
  241 + assertNull(userService.getUser(userId));
  242 + // 校验调用次数
  243 + verify(permissionService, times(1)).processUserDeleted(eq(userId));
116 244 }
117 245  
  246 +
  247 +
118 248 @Test
119 249 public void test_importUsers(){
120 250 SysDeptDO dept = randomPojo(SysDeptDO.class, o -> { // 等会查询到
121 251 o.setName("开发部");
122   - o.setSort("1");
  252 + o.setSort(1);
123 253 o.setStatus(CommonStatusEnum.ENABLE.getStatus());
124 254 });
125   - int depId = deptMapper.insert(dept);
  255 +// int depId = deptMapper.insert(dept);
  256 + int depId = 0;
126 257 // 准备参数
127 258 List<SysUserImportExcelVO> list = new ArrayList<>();
128 259 list.add(randomPojo(SysUserImportExcelVO.class, o->{
... ... @@ -153,18 +284,15 @@ public class SysUserServiceImplTest extends BaseSpringBootUnitTest {
153 284 assertEquals(respVOUpdate.getUpdateUsernames().size(),3);
154 285 }
155 286  
156   - public SysUserCreateReqVO randomUserVO(){
157   -
158   - SysUserCreateReqVO userVO = new SysUserCreateReqVO();
159   - userVO.setUsername(RandomUtils.randomString());
160   - userVO.setNickname(RandomUtils.randomString());
161   - userVO.setMobile(RandomUtil.randomNumbers(11));
162   - userVO.setEmail(RandomUtils.randomString()+"@ruoyi.com");
163   - userVO.setDeptId(null);
164   - userVO.setPostIds(Collections.emptySet());
165   -
166   - userVO.setPassword(RandomUtils.randomString());
167   - return userVO;
  287 + // ========== 随机对象 ==========
168 288  
  289 + @SafeVarargs
  290 + private static SysUserDO randomSysUserDO(Consumer<SysUserDO>... consumers) {
  291 + Consumer<SysUserDO> consumer = (o) -> {
  292 + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围
  293 + o.setSex(randomEle(SysSexEnum.values()).getSex()); // 保证 sex 的范围
  294 + };
  295 + return randomPojo(SysUserDO.class, ArrayUtils.append(consumer, consumers));
169 296 }
  297 +
170 298 }
... ...