Commit adac2e63cb3b7ba243348a624e936a2b95194679

Authored by budliang
2 parents a5090267 d79bf795

Merge branch 'rouyi/master' into feature/notice_test

src/main/java/cn/iocoder/dashboard/framework/mybatis/config/MybatisConfiguration.java
@@ -13,7 +13,8 @@ import org.springframework.context.annotation.Configuration; @@ -13,7 +13,8 @@ import org.springframework.context.annotation.Configuration;
13 * @author 芋道源码 13 * @author 芋道源码
14 */ 14 */
15 @Configuration 15 @Configuration
16 -@MapperScan(value = "${yudao.info.base-package}", annotationClass = Mapper.class) 16 +@MapperScan(value = "${yudao.info.base-package}", annotationClass = Mapper.class,
  17 + lazyInitialization = "${mybatis.lazy-initialization:false}") // Mapper 懒加载,目前仅用于单元测试
17 public class MybatisConfiguration { 18 public class MybatisConfiguration {
18 19
19 @Bean 20 @Bean
src/main/java/cn/iocoder/dashboard/framework/security/config/SecurityConfiguration.java
@@ -152,7 +152,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @@ -152,7 +152,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
152 .anyRequest().authenticated() 152 .anyRequest().authenticated()
153 .and() 153 .and()
154 .headers().frameOptions().disable(); 154 .headers().frameOptions().disable();
155 - httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler); 155 + httpSecurity.logout().logoutUrl(webProperties.getApiPrefix() + "/logout").logoutSuccessHandler(logoutSuccessHandler);
156 // 添加 JWT Filter 156 // 添加 JWT Filter
157 httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); 157 httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
158 } 158 }
src/main/java/cn/iocoder/dashboard/framework/security/core/handler/LogoutSuccessHandlerImpl.java
1 package cn.iocoder.dashboard.framework.security.core.handler; 1 package cn.iocoder.dashboard.framework.security.core.handler;
2 2
3 import cn.hutool.core.util.StrUtil; 3 import cn.hutool.core.util.StrUtil;
  4 +import cn.iocoder.dashboard.common.pojo.CommonResult;
4 import cn.iocoder.dashboard.framework.security.config.SecurityProperties; 5 import cn.iocoder.dashboard.framework.security.config.SecurityProperties;
5 import cn.iocoder.dashboard.framework.security.core.service.SecurityAuthFrameworkService; 6 import cn.iocoder.dashboard.framework.security.core.service.SecurityAuthFrameworkService;
6 import cn.iocoder.dashboard.framework.security.core.util.SecurityFrameworkUtils; 7 import cn.iocoder.dashboard.framework.security.core.util.SecurityFrameworkUtils;
@@ -36,6 +37,6 @@ public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler { @@ -36,6 +37,6 @@ public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler {
36 securityFrameworkService.logout(token); 37 securityFrameworkService.logout(token);
37 } 38 }
38 // 返回成功 39 // 返回成功
39 - ServletUtils.writeJSON(response, null); 40 + ServletUtils.writeJSON(response, CommonResult.success(null));
40 } 41 }
41 } 42 }
src/main/java/cn/iocoder/dashboard/framework/security/core/util/SecurityFrameworkUtils.java
@@ -2,7 +2,10 @@ package cn.iocoder.dashboard.framework.security.core.util; @@ -2,7 +2,10 @@ package cn.iocoder.dashboard.framework.security.core.util;
2 2
3 import cn.iocoder.dashboard.framework.security.core.LoginUser; 3 import cn.iocoder.dashboard.framework.security.core.LoginUser;
4 import cn.iocoder.dashboard.framework.web.core.util.WebFrameworkUtils; 4 import cn.iocoder.dashboard.framework.web.core.util.WebFrameworkUtils;
  5 +import org.springframework.lang.Nullable;
5 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; 6 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
  7 +import org.springframework.security.core.Authentication;
  8 +import org.springframework.security.core.context.SecurityContext;
6 import org.springframework.security.core.context.SecurityContextHolder; 9 import org.springframework.security.core.context.SecurityContextHolder;
7 import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; 10 import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
8 import org.springframework.util.StringUtils; 11 import org.springframework.util.StringUtils;
@@ -40,9 +43,20 @@ public class SecurityFrameworkUtils { @@ -40,9 +43,20 @@ public class SecurityFrameworkUtils {
40 43
41 /** 44 /**
42 * 获取当前用户 45 * 获取当前用户
  46 + *
  47 + * @return 当前用户
43 */ 48 */
  49 + @Nullable
44 public static LoginUser getLoginUser() { 50 public static LoginUser getLoginUser() {
45 - return (LoginUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 51 + SecurityContext context = SecurityContextHolder.getContext();
  52 + if (context == null) {
  53 + return null;
  54 + }
  55 + Authentication authentication = context.getAuthentication();
  56 + if (authentication == null) {
  57 + return null;
  58 + }
  59 + return (LoginUser) authentication.getPrincipal();
46 } 60 }
47 61
48 /** 62 /**
@@ -50,8 +64,10 @@ public class SecurityFrameworkUtils { @@ -50,8 +64,10 @@ public class SecurityFrameworkUtils {
50 * 64 *
51 * @return 用户编号 65 * @return 用户编号
52 */ 66 */
  67 + @Nullable
53 public static Long getLoginUserId() { 68 public static Long getLoginUserId() {
54 - return getLoginUser().getId(); 69 + LoginUser loginUser = getLoginUser();
  70 + return loginUser != null ? loginUser.getId() : null;
55 } 71 }
56 72
57 /** 73 /**
@@ -59,8 +75,10 @@ public class SecurityFrameworkUtils { @@ -59,8 +75,10 @@ public class SecurityFrameworkUtils {
59 * 75 *
60 * @return 角色编号数组 76 * @return 角色编号数组
61 */ 77 */
  78 + @Nullable
62 public static Set<Long> getLoginUserRoleIds() { 79 public static Set<Long> getLoginUserRoleIds() {
63 - return getLoginUser().getRoleIds(); 80 + LoginUser loginUser = getLoginUser();
  81 + return loginUser != null ? loginUser.getRoleIds() : null;
64 } 82 }
65 83
66 /** 84 /**
src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysAuthServiceImpl.java
@@ -160,7 +160,26 @@ public class SysAuthServiceImpl implements SysAuthService { @@ -160,7 +160,26 @@ public class SysAuthServiceImpl implements SysAuthService {
160 160
161 @Override 161 @Override
162 public void logout(String token) { 162 public void logout(String token) {
163 -// AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "退出成功")); TODO 需要搞一搞 163 + // 查询用户信息
  164 + LoginUser loginUser = userSessionService.getLoginUser(token);
  165 + if (loginUser == null) {
  166 + return;
  167 + }
  168 + // 删除 session
  169 + userSessionService.deleteUserSession(token);
  170 + // 记录登出日子和
  171 + this.createLogoutLog(loginUser.getUsername());
  172 + }
  173 +
  174 + private void createLogoutLog(String username) {
  175 + SysLoginLogCreateReqVO reqVO = new SysLoginLogCreateReqVO();
  176 + reqVO.setLogType(SysLoginLogTypeEnum.LOGOUT_SELF.getType());
  177 + reqVO.setTraceId(TracerUtils.getTraceId());
  178 + reqVO.setUsername(username);
  179 + reqVO.setUserAgent(ServletUtils.getUserAgent());
  180 + reqVO.setUserIp(ServletUtils.getClientIP());
  181 + reqVO.setResult(SysLoginResultEnum.SUCCESS.getResult());
  182 + loginLogService.createLoginLog(reqVO);
164 } 183 }
165 184
166 @Override 185 @Override
src/test/java/cn/iocoder/dashboard/BaseDbAndRedisUnitTest.java 0 → 100644
  1 +package cn.iocoder.dashboard;
  2 +
  3 +import cn.iocoder.dashboard.config.RedisTestConfiguration;
  4 +import cn.iocoder.dashboard.framework.datasource.config.DataSourceConfiguration;
  5 +import cn.iocoder.dashboard.framework.mybatis.config.MybatisConfiguration;
  6 +import cn.iocoder.dashboard.framework.redis.config.RedisConfig;
  7 +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
  8 +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
  9 +import org.redisson.spring.starter.RedissonAutoConfiguration;
  10 +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
  11 +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
  12 +import org.springframework.boot.test.context.SpringBootTest;
  13 +import org.springframework.context.annotation.Import;
  14 +import org.springframework.test.context.ActiveProfiles;
  15 +import org.springframework.test.context.jdbc.Sql;
  16 +
  17 +/**
  18 + * 依赖内存 DB 的单元测试
  19 + *
  20 + * 注意,Service 层同样适用。对于 Service 层的单元测试,我们针对自己模块的 Mapper 走的是 H2 内存数据库,针对别的模块的 Service 走的是 Mock 方法
  21 + *
  22 + * @author 芋道源码
  23 + */
  24 +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbAndRedisUnitTest.Application.class)
  25 +@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件
  26 +@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB
  27 +public class BaseDbAndRedisUnitTest {
  28 +
  29 + @Import({
  30 + // DB 配置类
  31 + DataSourceConfiguration.class, // 自己的 DB 配置类
  32 + DataSourceAutoConfiguration.class, // Spring DB 自动配置类
  33 + DruidDataSourceAutoConfigure.class, // Druid 自动配置类
  34 + // MyBatis 配置类
  35 + MybatisConfiguration.class, // 自己的 MyBatis 配置类
  36 + MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类
  37 + // Redis 配置类
  38 + RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer
  39 + RedisAutoConfiguration.class, // Spring Redis 自动配置类
  40 + RedisConfig.class, // 自己的 Redis 配置类
  41 + RedissonAutoConfiguration.class, // Redisson 自动高配置类
  42 + })
  43 + public static class Application {
  44 + }
  45 +
  46 +}
src/test/java/cn/iocoder/dashboard/BaseDbUnitTest.java 0 → 100644
  1 +package cn.iocoder.dashboard;
  2 +
  3 +import cn.iocoder.dashboard.framework.datasource.config.DataSourceConfiguration;
  4 +import cn.iocoder.dashboard.framework.mybatis.config.MybatisConfiguration;
  5 +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
  6 +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
  7 +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
  8 +import org.springframework.boot.test.context.SpringBootTest;
  9 +import org.springframework.context.annotation.Import;
  10 +import org.springframework.test.context.ActiveProfiles;
  11 +import org.springframework.test.context.jdbc.Sql;
  12 +
  13 +/**
  14 + * 依赖内存 DB 的单元测试
  15 + *
  16 + * 注意,Service 层同样适用。对于 Service 层的单元测试,我们针对自己模块的 Mapper 走的是 H2 内存数据库,针对别的模块的 Service 走的是 Mock 方法
  17 + *
  18 + * @author 芋道源码
  19 + */
  20 +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbUnitTest.Application.class)
  21 +@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件
  22 +@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB
  23 +public class BaseDbUnitTest {
  24 +
  25 + @Import({
  26 + // DB 配置类
  27 + DataSourceConfiguration.class, // 自己的 DB 配置类
  28 + DataSourceAutoConfiguration.class, // Spring DB 自动配置类
  29 + DruidDataSourceAutoConfigure.class, // Druid 自动配置类
  30 + // MyBatis 配置类
  31 + MybatisConfiguration.class, // 自己的 MyBatis 配置类
  32 + MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类
  33 + })
  34 + public static class Application {
  35 + }
  36 +
  37 +}
src/test/java/cn/iocoder/dashboard/BaseSpringBootUnitTest.java
@@ -12,6 +12,7 @@ import javax.annotation.Resource; @@ -12,6 +12,7 @@ import javax.annotation.Resource;
12 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) 12 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
13 @ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 13 @ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件
14 @Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB 14 @Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB
  15 +@Deprecated
15 public class BaseSpringBootUnitTest { 16 public class BaseSpringBootUnitTest {
16 17
17 @Resource 18 @Resource
src/test/java/cn/iocoder/dashboard/config/RedisTestConfiguration.java
@@ -8,12 +8,10 @@ import org.springframework.boot.autoconfigure.data.redis.RedisProperties; @@ -8,12 +8,10 @@ import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
8 import org.springframework.boot.context.properties.EnableConfigurationProperties; 8 import org.springframework.boot.context.properties.EnableConfigurationProperties;
9 import org.springframework.context.annotation.Bean; 9 import org.springframework.context.annotation.Bean;
10 import org.springframework.context.annotation.Configuration; 10 import org.springframework.context.annotation.Configuration;
11 -import org.springframework.context.annotation.Lazy;  
12 11
13 import java.io.IOException; 12 import java.io.IOException;
14 13
15 @Configuration(proxyBeanMethods = false) 14 @Configuration(proxyBeanMethods = false)
16 -@Lazy(false) // 禁用懒加载,因为需要保证 Redis Server 必须先启动  
17 @EnableConfigurationProperties(RedisProperties.class) 15 @EnableConfigurationProperties(RedisProperties.class)
18 @AutoConfigureBefore({RedisAutoConfiguration.class, RedissonAutoConfiguration.class}) // 在 Redis 自动配置前,进行初始化 16 @AutoConfigureBefore({RedisAutoConfiguration.class, RedissonAutoConfiguration.class}) // 在 Redis 自动配置前,进行初始化
19 public class RedisTestConfiguration { 17 public class RedisTestConfiguration {
src/test/java/cn/iocoder/dashboard/config/SecurityTestConfiguration.java deleted
1 -package cn.iocoder.dashboard.config;  
2 -  
3 -import org.mockito.Mockito;  
4 -import org.springframework.context.annotation.Bean;  
5 -import org.springframework.context.annotation.Configuration;  
6 -import org.springframework.security.authentication.AuthenticationManager;  
7 -  
8 -@Configuration  
9 -public class SecurityTestConfiguration {  
10 -  
11 - @Bean  
12 - public AuthenticationManager authenticationManager() {  
13 - return Mockito.mock(AuthenticationManager.class);  
14 - }  
15 -  
16 -}  
src/test/java/cn/iocoder/dashboard/modules/infra/service/config/InfConfigServiceTest.java
1 package cn.iocoder.dashboard.modules.infra.service.config; 1 package cn.iocoder.dashboard.modules.infra.service.config;
2 2
3 -import cn.iocoder.dashboard.BaseSpringBootUnitTest; 3 +import cn.iocoder.dashboard.BaseDbUnitTest;
4 import cn.iocoder.dashboard.common.pojo.PageResult; 4 import cn.iocoder.dashboard.common.pojo.PageResult;
5 import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigCreateReqVO; 5 import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigCreateReqVO;
6 import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigExportReqVO; 6 import cn.iocoder.dashboard.modules.infra.controller.config.vo.InfConfigExportReqVO;
@@ -15,6 +15,7 @@ import cn.iocoder.dashboard.util.collection.ArrayUtils; @@ -15,6 +15,7 @@ import cn.iocoder.dashboard.util.collection.ArrayUtils;
15 import cn.iocoder.dashboard.util.object.ObjectUtils; 15 import cn.iocoder.dashboard.util.object.ObjectUtils;
16 import org.junit.jupiter.api.Test; 16 import org.junit.jupiter.api.Test;
17 import org.springframework.boot.test.mock.mockito.MockBean; 17 import org.springframework.boot.test.mock.mockito.MockBean;
  18 +import org.springframework.context.annotation.Import;
18 19
19 import javax.annotation.Resource; 20 import javax.annotation.Resource;
20 import java.util.List; 21 import java.util.List;
@@ -35,7 +36,8 @@ import static org.mockito.Mockito.verify; @@ -35,7 +36,8 @@ import static org.mockito.Mockito.verify;
35 * 36 *
36 * @author 芋道源码 37 * @author 芋道源码
37 */ 38 */
38 -public class InfConfigServiceTest extends BaseSpringBootUnitTest { 39 +@Import(InfConfigServiceImpl.class)
  40 +public class InfConfigServiceTest extends BaseDbUnitTest {
39 41
40 @Resource 42 @Resource
41 private InfConfigServiceImpl configService; 43 private InfConfigServiceImpl configService;
src/test/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthServiceImplTest.java
1 package cn.iocoder.dashboard.modules.system.service.auth; 1 package cn.iocoder.dashboard.modules.system.service.auth;
2 2
3 -import cn.iocoder.dashboard.BaseSpringBootUnitTest; 3 +import cn.iocoder.dashboard.BaseDbUnitTest;
4 import cn.iocoder.dashboard.common.enums.CommonStatusEnum; 4 import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
5 import cn.iocoder.dashboard.framework.security.core.LoginUser; 5 import cn.iocoder.dashboard.framework.security.core.LoginUser;
6 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; 6 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO;
7 import cn.iocoder.dashboard.modules.system.service.auth.impl.SysAuthServiceImpl; 7 import cn.iocoder.dashboard.modules.system.service.auth.impl.SysAuthServiceImpl;
  8 +import cn.iocoder.dashboard.modules.system.service.common.SysCaptchaService;
  9 +import cn.iocoder.dashboard.modules.system.service.logger.SysLoginLogService;
8 import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; 10 import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
9 import cn.iocoder.dashboard.modules.system.service.user.SysUserService; 11 import cn.iocoder.dashboard.modules.system.service.user.SysUserService;
10 import cn.iocoder.dashboard.util.AssertUtils; 12 import cn.iocoder.dashboard.util.AssertUtils;
11 import org.junit.jupiter.api.Test; 13 import org.junit.jupiter.api.Test;
12 import org.springframework.boot.test.mock.mockito.MockBean; 14 import org.springframework.boot.test.mock.mockito.MockBean;
  15 +import org.springframework.context.annotation.Import;
  16 +import org.springframework.security.authentication.AuthenticationManager;
13 import org.springframework.security.core.userdetails.UsernameNotFoundException; 17 import org.springframework.security.core.userdetails.UsernameNotFoundException;
14 18
15 import javax.annotation.Resource; 19 import javax.annotation.Resource;
@@ -21,7 +25,13 @@ import static org.junit.jupiter.api.Assertions.*; @@ -21,7 +25,13 @@ import static org.junit.jupiter.api.Assertions.*;
21 import static org.mockito.ArgumentMatchers.eq; 25 import static org.mockito.ArgumentMatchers.eq;
22 import static org.mockito.Mockito.when; 26 import static org.mockito.Mockito.when;
23 27
24 -public class SysAuthServiceImplTest extends BaseSpringBootUnitTest { 28 +/**
  29 + * {@link SysAuthServiceImpl} 的单元测试
  30 + *
  31 + * @author 芋道源码
  32 + */
  33 +@Import(SysAuthServiceImpl.class)
  34 +public class SysAuthServiceImplTest extends BaseDbUnitTest {
25 35
26 @Resource 36 @Resource
27 private SysAuthServiceImpl authService; 37 private SysAuthServiceImpl authService;
@@ -30,6 +40,14 @@ public class SysAuthServiceImplTest extends BaseSpringBootUnitTest { @@ -30,6 +40,14 @@ public class SysAuthServiceImplTest extends BaseSpringBootUnitTest {
30 private SysUserService userService; 40 private SysUserService userService;
31 @MockBean 41 @MockBean
32 private SysPermissionService permissionService; 42 private SysPermissionService permissionService;
  43 + @MockBean
  44 + private AuthenticationManager authenticationManager;
  45 + @MockBean
  46 + private SysCaptchaService captchaService;
  47 + @MockBean
  48 + private SysLoginLogService loginLogService;
  49 + @MockBean
  50 + private SysUserSessionService userSessionService;
33 51
34 @Test 52 @Test
35 public void testLoadUserByUsername_success() { 53 public void testLoadUserByUsername_success() {
src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictDataServiceTest.java
1 package cn.iocoder.dashboard.modules.system.service.dict; 1 package cn.iocoder.dashboard.modules.system.service.dict;
2 2
3 -import cn.iocoder.dashboard.BaseSpringBootUnitTest; 3 +import cn.iocoder.dashboard.BaseDbUnitTest;
4 import cn.iocoder.dashboard.common.enums.CommonStatusEnum; 4 import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
5 import cn.iocoder.dashboard.common.pojo.PageResult; 5 import cn.iocoder.dashboard.common.pojo.PageResult;
6 import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO; 6 import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO;
@@ -17,6 +17,7 @@ import cn.iocoder.dashboard.util.object.ObjectUtils; @@ -17,6 +17,7 @@ import cn.iocoder.dashboard.util.object.ObjectUtils;
17 import com.google.common.collect.ImmutableTable; 17 import com.google.common.collect.ImmutableTable;
18 import org.junit.jupiter.api.Test; 18 import org.junit.jupiter.api.Test;
19 import org.springframework.boot.test.mock.mockito.MockBean; 19 import org.springframework.boot.test.mock.mockito.MockBean;
  20 +import org.springframework.context.annotation.Import;
20 21
21 import javax.annotation.Resource; 22 import javax.annotation.Resource;
22 import java.util.Date; 23 import java.util.Date;
@@ -37,7 +38,8 @@ import static org.mockito.Mockito.*; @@ -37,7 +38,8 @@ import static org.mockito.Mockito.*;
37 * 38 *
38 * @author 芋道源码 39 * @author 芋道源码
39 */ 40 */
40 -public class SysDictDataServiceTest extends BaseSpringBootUnitTest { 41 +@Import(SysDictDataServiceImpl.class)
  42 +public class SysDictDataServiceTest extends BaseDbUnitTest {
41 43
42 @Resource 44 @Resource
43 private SysDictDataServiceImpl dictDataService; 45 private SysDictDataServiceImpl dictDataService;
src/test/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeServiceTest.java
1 package cn.iocoder.dashboard.modules.system.service.dict; 1 package cn.iocoder.dashboard.modules.system.service.dict;
2 2
3 -import cn.iocoder.dashboard.BaseSpringBootUnitTest; 3 +import cn.iocoder.dashboard.BaseDbUnitTest;
4 import cn.iocoder.dashboard.common.enums.CommonStatusEnum; 4 import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
5 import cn.iocoder.dashboard.common.pojo.PageResult; 5 import cn.iocoder.dashboard.common.pojo.PageResult;
6 import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypeCreateReqVO; 6 import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.SysDictTypeCreateReqVO;
@@ -14,6 +14,7 @@ import cn.iocoder.dashboard.util.collection.ArrayUtils; @@ -14,6 +14,7 @@ import cn.iocoder.dashboard.util.collection.ArrayUtils;
14 import cn.iocoder.dashboard.util.object.ObjectUtils; 14 import cn.iocoder.dashboard.util.object.ObjectUtils;
15 import org.junit.jupiter.api.Test; 15 import org.junit.jupiter.api.Test;
16 import org.springframework.boot.test.mock.mockito.MockBean; 16 import org.springframework.boot.test.mock.mockito.MockBean;
  17 +import org.springframework.context.annotation.Import;
17 18
18 import javax.annotation.Resource; 19 import javax.annotation.Resource;
19 import java.util.List; 20 import java.util.List;
@@ -24,7 +25,6 @@ import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; @@ -24,7 +25,6 @@ import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
24 import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; 25 import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals;
25 import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException; 26 import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException;
26 import static cn.iocoder.dashboard.util.RandomUtils.*; 27 import static cn.iocoder.dashboard.util.RandomUtils.*;
27 -import static cn.iocoder.dashboard.util.RandomUtils.randomString;  
28 import static cn.iocoder.dashboard.util.date.DateUtils.buildTime; 28 import static cn.iocoder.dashboard.util.date.DateUtils.buildTime;
29 import static org.junit.jupiter.api.Assertions.*; 29 import static org.junit.jupiter.api.Assertions.*;
30 import static org.mockito.ArgumentMatchers.eq; 30 import static org.mockito.ArgumentMatchers.eq;
@@ -35,7 +35,8 @@ import static org.mockito.Mockito.when; @@ -35,7 +35,8 @@ import static org.mockito.Mockito.when;
35 * 35 *
36 * @author 芋道源码 36 * @author 芋道源码
37 */ 37 */
38 -public class SysDictTypeServiceTest extends BaseSpringBootUnitTest { 38 +@Import(SysDictTypeServiceImpl.class)
  39 +public class SysDictTypeServiceTest extends BaseDbUnitTest {
39 40
40 @Resource 41 @Resource
41 private SysDictTypeServiceImpl dictTypeService; 42 private SysDictTypeServiceImpl dictTypeService;
src/test/resources/application-unit-test.yaml
@@ -3,21 +3,6 @@ spring: @@ -3,21 +3,6 @@ spring:
3 lazy-initialization: true # 开启懒加载,加快速度 3 lazy-initialization: true # 开启懒加载,加快速度
4 banner-mode: off # 单元测试,禁用 Banner 4 banner-mode: off # 单元测试,禁用 Banner
5 5
6 - # 去除的自动配置项  
7 - autoconfigure:  
8 - exclude:  
9 - - org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration # 单元测试,禁用 SpringSecurity  
10 - - org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration # 单元测试,禁用 SpringSecurity  
11 - - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 单元测试,禁用 Quartz  
12 - - com.baomidou.lock.spring.boot.autoconfigure.LockAutoConfiguration # 单元测试,禁用 Lock4j 分布式锁  
13 - - org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration # 单元测试,禁用 Scheduler 定时任务  
14 - - org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration # 项目没有使用 Spring Data,所以禁用配置类,加速启动  
15 -  
16 -# Swagger 接口文档的自动配置(单元测试,禁用 Swagger)  
17 -springfox:  
18 - documentation:  
19 - auto-startup: false  
20 -  
21 --- #################### 数据库相关配置 #################### 6 --- #################### 数据库相关配置 ####################
22 7
23 spring: 8 spring:
@@ -29,6 +14,9 @@ spring: @@ -29,6 +14,9 @@ spring:
29 username: sa 14 username: sa
30 password: 15 password:
31 schema: classpath:sql/create_tables.sql # MySQL 转 H2 的语句,使用 https://www.jooq.org/translate/ 工具 16 schema: classpath:sql/create_tables.sql # MySQL 转 H2 的语句,使用 https://www.jooq.org/translate/ 工具
  17 + druid:
  18 + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度
  19 + initial-size: 1 # 单元测试,配置为 1,提升启动速度
32 20
33 # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 21 # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
34 redis: 22 redis:
@@ -36,17 +24,13 @@ spring: @@ -36,17 +24,13 @@ spring:
36 port: 16379 # 端口(单元测试,使用 16379 端口) 24 port: 16379 # 端口(单元测试,使用 16379 端口)
37 database: 0 # 数据库索引 25 database: 0 # 数据库索引
38 26
39 ---- #################### 定时任务相关配置 #################### 27 +mybatis:
  28 + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试
40 29
41 -# Quartz 配置项,对应 QuartzProperties 配置类(单元测试,禁用 Quartz) 30 +--- #################### 定时任务相关配置 ####################
42 31
43 --- #################### 配置中心相关配置 #################### 32 --- #################### 配置中心相关配置 ####################
44 33
45 -# Apollo 配置中心  
46 -apollo:  
47 - bootstrap:  
48 - enabled: false # 单元测试,禁用配置中心  
49 -  
50 --- #################### 服务保障相关配置 #################### 34 --- #################### 服务保障相关配置 ####################
51 35
52 # Lock4j 配置项(单元测试,禁用 Lock4j) 36 # Lock4j 配置项(单元测试,禁用 Lock4j)
@@ -63,23 +47,6 @@ resilience4j: @@ -63,23 +47,6 @@ resilience4j:
63 47
64 --- #################### 监控相关配置 #################### 48 --- #################### 监控相关配置 ####################
65 49
66 -# Actuator 监控端点的配置项  
67 -management:  
68 - endpoints:  
69 - enabled-by-default: false  
70 -  
71 -# Spring Boot Admin 配置项  
72 -spring:  
73 - boot:  
74 - admin:  
75 - # Spring Boot Admin Client 客户端的相关配置  
76 - client:  
77 - enabled: false  
78 - # Spring Boot Admin Server 服务端的相关配置  
79 - context-path: /admin # 配置 Spring  
80 -  
81 -# 日志文件配置(不需要配置)  
82 -  
83 --- #################### 芋道相关配置 #################### 50 --- #################### 芋道相关配置 ####################
84 51
85 # 芋道配置项,设置当前项目所有自定义的配置 52 # 芋道配置项,设置当前项目所有自定义的配置
src/test/resources/sql/create_tables.sql
@@ -9,9 +9,9 @@ CREATE TABLE IF NOT EXISTS &quot;inf_config&quot; ( @@ -9,9 +9,9 @@ CREATE TABLE IF NOT EXISTS &quot;inf_config&quot; (
9 "value" varchar(500) NOT NULL DEFAULT '', 9 "value" varchar(500) NOT NULL DEFAULT '',
10 "sensitive" bit NOT NULL, 10 "sensitive" bit NOT NULL,
11 "remark" varchar(500) DEFAULT NULL, 11 "remark" varchar(500) DEFAULT NULL,
12 - "create_by" varchar(64) DEFAULT '', 12 + "creator" varchar(64) DEFAULT '',
13 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 13 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
14 - "update_by" varchar(64) DEFAULT '', 14 + "updater" varchar(64) DEFAULT '',
15 "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 15 "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
16 "deleted" bit NOT NULL DEFAULT FALSE, 16 "deleted" bit NOT NULL DEFAULT FALSE,
17 PRIMARY KEY ("id") 17 PRIMARY KEY ("id")
@@ -28,9 +28,9 @@ CREATE TABLE IF NOT EXISTS &quot;sys_dept&quot; ( @@ -28,9 +28,9 @@ CREATE TABLE IF NOT EXISTS &quot;sys_dept&quot; (
28 "phone" varchar(11) DEFAULT NULL, 28 "phone" varchar(11) DEFAULT NULL,
29 "email" varchar(50) DEFAULT NULL, 29 "email" varchar(50) DEFAULT NULL,
30 "status" tinyint NOT NULL, 30 "status" tinyint NOT NULL,
31 - "create_by" varchar(64) DEFAULT '', 31 + "creator" varchar(64) DEFAULT '',
32 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 32 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
33 - "update_by" varchar(64) DEFAULT '', 33 + "updater" varchar(64) DEFAULT '',
34 "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 34 "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
35 "deleted" bit NOT NULL DEFAULT FALSE, 35 "deleted" bit NOT NULL DEFAULT FALSE,
36 PRIMARY KEY ("id") 36 PRIMARY KEY ("id")
@@ -44,9 +44,9 @@ CREATE TABLE IF NOT EXISTS &quot;sys_dict_data&quot; ( @@ -44,9 +44,9 @@ CREATE TABLE IF NOT EXISTS &quot;sys_dict_data&quot; (
44 "dict_type" varchar(100) NOT NULL DEFAULT '', 44 "dict_type" varchar(100) NOT NULL DEFAULT '',
45 "status" tinyint NOT NULL DEFAULT '0', 45 "status" tinyint NOT NULL DEFAULT '0',
46 "remark" varchar(500) DEFAULT NULL, 46 "remark" varchar(500) DEFAULT NULL,
47 - "create_by" varchar(64) DEFAULT '', 47 + "creator" varchar(64) DEFAULT '',
48 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 48 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
49 - "update_by" varchar(64) DEFAULT '', 49 + "updater" varchar(64) DEFAULT '',
50 "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 50 "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
51 "deleted" bit NOT NULL DEFAULT FALSE, 51 "deleted" bit NOT NULL DEFAULT FALSE,
52 PRIMARY KEY ("id") 52 PRIMARY KEY ("id")
@@ -62,9 +62,9 @@ CREATE TABLE IF NOT EXISTS &quot;sys_role&quot; ( @@ -62,9 +62,9 @@ CREATE TABLE IF NOT EXISTS &quot;sys_role&quot; (
62 "status" tinyint NOT NULL, 62 "status" tinyint NOT NULL,
63 "type" tinyint NOT NULL, 63 "type" tinyint NOT NULL,
64 "remark" varchar(500) DEFAULT NULL, 64 "remark" varchar(500) DEFAULT NULL,
65 - "create_by" varchar(64) DEFAULT '', 65 + "creator" varchar(64) DEFAULT '',
66 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 66 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
67 - "update_by" varchar(64) DEFAULT '', 67 + "updater" varchar(64) DEFAULT '',
68 "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 68 "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
69 "deleted" bit NOT NULL DEFAULT FALSE, 69 "deleted" bit NOT NULL DEFAULT FALSE,
70 PRIMARY KEY ("id") 70 PRIMARY KEY ("id")
@@ -74,9 +74,9 @@ CREATE TABLE IF NOT EXISTS &quot;sys_role_menu&quot; ( @@ -74,9 +74,9 @@ CREATE TABLE IF NOT EXISTS &quot;sys_role_menu&quot; (
74 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, 74 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
75 "role_id" bigint NOT NULL, 75 "role_id" bigint NOT NULL,
76 "menu_id" bigint NOT NULL, 76 "menu_id" bigint NOT NULL,
77 - "create_by" varchar(64) DEFAULT '', 77 + "creator" varchar(64) DEFAULT '',
78 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 78 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
79 - "update_by" varchar(64) DEFAULT '', 79 + "updater" varchar(64) DEFAULT '',
80 "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 80 "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
81 "deleted" bit NOT NULL DEFAULT FALSE, 81 "deleted" bit NOT NULL DEFAULT FALSE,
82 PRIMARY KEY ("id") 82 PRIMARY KEY ("id")
@@ -93,9 +93,9 @@ CREATE TABLE IF NOT EXISTS &quot;sys_menu&quot; ( @@ -93,9 +93,9 @@ CREATE TABLE IF NOT EXISTS &quot;sys_menu&quot; (
93 "icon" varchar(100) DEFAULT '#', 93 "icon" varchar(100) DEFAULT '#',
94 "component" varchar(255) DEFAULT NULL, 94 "component" varchar(255) DEFAULT NULL,
95 "status" tinyint NOT NULL DEFAULT '0', 95 "status" tinyint NOT NULL DEFAULT '0',
96 - "create_by" varchar(64) DEFAULT '', 96 + "creator" varchar(64) DEFAULT '',
97 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 97 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
98 - "update_by" varchar(64) DEFAULT '', 98 + "updater" varchar(64) DEFAULT '',
99 "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 99 "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
100 "deleted" bit NOT NULL DEFAULT FALSE, 100 "deleted" bit NOT NULL DEFAULT FALSE,
101 PRIMARY KEY ("id") 101 PRIMARY KEY ("id")
@@ -107,9 +107,9 @@ CREATE TABLE &quot;sys_dict_type&quot; ( @@ -107,9 +107,9 @@ CREATE TABLE &quot;sys_dict_type&quot; (
107 "type" varchar(100) NOT NULL DEFAULT '', 107 "type" varchar(100) NOT NULL DEFAULT '',
108 "status" tinyint NOT NULL DEFAULT '0', 108 "status" tinyint NOT NULL DEFAULT '0',
109 "remark" varchar(500) DEFAULT NULL, 109 "remark" varchar(500) DEFAULT NULL,
110 - "create_by" varchar(64) DEFAULT '', 110 + "creator" varchar(64) DEFAULT '',
111 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 111 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
112 - "update_by" varchar(64) DEFAULT '', 112 + "updater" varchar(64) DEFAULT '',
113 "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 113 "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
114 "deleted" bit NOT NULL DEFAULT FALSE, 114 "deleted" bit NOT NULL DEFAULT FALSE,
115 PRIMARY KEY ("id") 115 PRIMARY KEY ("id")