Commit 6f66d78865633908ec912071f3d1368a7017cc5e

Authored by YunaiV
1 parent 21201e12

test: 修复时间精度差异并恢复时间字段断言

统一持久化测试的时间精度,固定 OAuth2 生成时间并校验过期时长。
恢复数据库、Redis、日志清理及支付提交中的时间字段断言。
yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/job/JobLogServiceImplTest.java
@@ -101,7 +101,7 @@ public class JobLogServiceImplTest extends BaseDbUnitTest { @@ -101,7 +101,7 @@ public class JobLogServiceImplTest extends BaseDbUnitTest {
101 JobLogDO log01 = randomPojo(JobLogDO.class, o -> o.setCreateTime(addTime(Duration.ofDays(-3)))) 101 JobLogDO log01 = randomPojo(JobLogDO.class, o -> o.setCreateTime(addTime(Duration.ofDays(-3))))
102 .setExecuteIndex(1); 102 .setExecuteIndex(1);
103 jobLogMapper.insert(log01); 103 jobLogMapper.insert(log01);
104 - JobLogDO log02 = randomPojo(JobLogDO.class, o -> o.setCreateTime(addTime(Duration.ofDays(-1)))) 104 + JobLogDO log02 = randomPojo(JobLogDO.class, o -> o.setCreateTime(addTime(Duration.ofDays(-1)).withNano(0)))
105 .setExecuteIndex(1); 105 .setExecuteIndex(1);
106 jobLogMapper.insert(log02); 106 jobLogMapper.insert(log02);
107 // 准备参数 107 // 准备参数
@@ -114,8 +114,7 @@ public class JobLogServiceImplTest extends BaseDbUnitTest { @@ -114,8 +114,7 @@ public class JobLogServiceImplTest extends BaseDbUnitTest {
114 assertEquals(1, count); 114 assertEquals(1, count);
115 List<JobLogDO> logs = jobLogMapper.selectList(); 115 List<JobLogDO> logs = jobLogMapper.selectList();
116 assertEquals(1, logs.size()); 116 assertEquals(1, logs.size());
117 - // TODO @芋艿:createTime updateTime 被屏蔽,仅 win11 会复现,建议后续修复。  
118 - assertPojoEquals(log02, logs.get(0), "createTime", "updateTime"); 117 + assertPojoEquals(log02, logs.get(0));
119 } 118 }
120 119
121 @Test 120 @Test
yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogServiceImplTest.java
@@ -79,7 +79,7 @@ public class ApiAccessLogServiceImplTest extends BaseDbUnitTest { @@ -79,7 +79,7 @@ public class ApiAccessLogServiceImplTest extends BaseDbUnitTest {
79 // mock 数据 79 // mock 数据
80 ApiAccessLogDO log01 = randomPojo(ApiAccessLogDO.class, o -> o.setCreateTime(addTime(Duration.ofDays(-3)))); 80 ApiAccessLogDO log01 = randomPojo(ApiAccessLogDO.class, o -> o.setCreateTime(addTime(Duration.ofDays(-3))));
81 apiAccessLogMapper.insert(log01); 81 apiAccessLogMapper.insert(log01);
82 - ApiAccessLogDO log02 = randomPojo(ApiAccessLogDO.class, o -> o.setCreateTime(addTime(Duration.ofDays(-1)))); 82 + ApiAccessLogDO log02 = randomPojo(ApiAccessLogDO.class, o -> o.setCreateTime(addTime(Duration.ofDays(-1)).withNano(0)));
83 apiAccessLogMapper.insert(log02); 83 apiAccessLogMapper.insert(log02);
84 // 准备参数 84 // 准备参数
85 Integer exceedDay = 2; 85 Integer exceedDay = 2;
@@ -91,8 +91,7 @@ public class ApiAccessLogServiceImplTest extends BaseDbUnitTest { @@ -91,8 +91,7 @@ public class ApiAccessLogServiceImplTest extends BaseDbUnitTest {
91 assertEquals(1, count); 91 assertEquals(1, count);
92 List<ApiAccessLogDO> logs = apiAccessLogMapper.selectList(); 92 List<ApiAccessLogDO> logs = apiAccessLogMapper.selectList();
93 assertEquals(1, logs.size()); 93 assertEquals(1, logs.size());
94 - // TODO @芋艿:createTime updateTime 被屏蔽,仅 win11 会复现,建议后续修复。  
95 - assertPojoEquals(log02, logs.get(0), "createTime", "updateTime"); 94 + assertPojoEquals(log02, logs.get(0));
96 } 95 }
97 96
98 @Test 97 @Test
yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogServiceImplTest.java
@@ -145,7 +145,7 @@ public class ApiErrorLogServiceImplTest extends BaseDbUnitTest { @@ -145,7 +145,7 @@ public class ApiErrorLogServiceImplTest extends BaseDbUnitTest {
145 // mock 数据 145 // mock 数据
146 ApiErrorLogDO log01 = randomPojo(ApiErrorLogDO.class, o -> o.setCreateTime(addTime(Duration.ofDays(-3)))); 146 ApiErrorLogDO log01 = randomPojo(ApiErrorLogDO.class, o -> o.setCreateTime(addTime(Duration.ofDays(-3))));
147 apiErrorLogMapper.insert(log01); 147 apiErrorLogMapper.insert(log01);
148 - ApiErrorLogDO log02 = randomPojo(ApiErrorLogDO.class, o -> o.setCreateTime(addTime(Duration.ofDays(-1)))); 148 + ApiErrorLogDO log02 = randomPojo(ApiErrorLogDO.class, o -> o.setCreateTime(addTime(Duration.ofDays(-1)).withNano(0)));
149 apiErrorLogMapper.insert(log02); 149 apiErrorLogMapper.insert(log02);
150 // 准备参数 150 // 准备参数
151 Integer exceedDay = 2; 151 Integer exceedDay = 2;
@@ -157,8 +157,7 @@ public class ApiErrorLogServiceImplTest extends BaseDbUnitTest { @@ -157,8 +157,7 @@ public class ApiErrorLogServiceImplTest extends BaseDbUnitTest {
157 assertEquals(1, count); 157 assertEquals(1, count);
158 List<ApiErrorLogDO> logs = apiErrorLogMapper.selectList(); 158 List<ApiErrorLogDO> logs = apiErrorLogMapper.selectList();
159 assertEquals(1, logs.size()); 159 assertEquals(1, logs.size());
160 - // TODO @芋艿:createTime updateTime 被屏蔽,仅 win11 会复现,建议后续修复。  
161 - assertPojoEquals(log02, logs.get(0), "createTime", "updateTime"); 160 + assertPojoEquals(log02, logs.get(0));
162 } 161 }
163 162
164 } 163 }
yudao-module-pay/src/test/java/cn/iocoder/yudao/module/pay/service/order/PayOrderServiceTest.java
@@ -340,7 +340,7 @@ public class PayOrderServiceTest extends BaseDbAndRedisUnitTest { @@ -340,7 +340,7 @@ public class PayOrderServiceTest extends BaseDbAndRedisUnitTest {
340 340
341 // mock 数据(order) 341 // mock 数据(order)
342 PayOrderDO order = randomPojo(PayOrderDO.class, o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) 342 PayOrderDO order = randomPojo(PayOrderDO.class, o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus())
343 - .setAppId(1L).setExpireTime(addTime(Duration.ofDays(1)))); 343 + .setAppId(1L).setExpireTime(addTime(Duration.ofDays(1)).withNano(0)));
344 orderMapper.insert(order); 344 orderMapper.insert(order);
345 // 准备参数 345 // 准备参数
346 PayOrderSubmitReqVO reqVO = randomPojo(PayOrderSubmitReqVO.class, o -> o.setId(order.getId()) 346 PayOrderSubmitReqVO reqVO = randomPojo(PayOrderSubmitReqVO.class, o -> o.setId(order.getId())
@@ -363,11 +363,9 @@ public class PayOrderServiceTest extends BaseDbAndRedisUnitTest { @@ -363,11 +363,9 @@ public class PayOrderServiceTest extends BaseDbAndRedisUnitTest {
363 when(client.unifiedOrder(argThat(payOrderUnifiedReqDTO -> { 363 when(client.unifiedOrder(argThat(payOrderUnifiedReqDTO -> {
364 assertNotNull(payOrderUnifiedReqDTO.getOutTradeNo()); 364 assertNotNull(payOrderUnifiedReqDTO.getOutTradeNo());
365 assertThat(payOrderUnifiedReqDTO) 365 assertThat(payOrderUnifiedReqDTO)
366 -// .extracting("subject", "body", "notifyUrl", "returnUrl", "price", "expireTime") // TODO @芋艿:win11 下,时间不太准  
367 - .extracting("subject", "body", "notifyUrl", "returnUrl", "price") 366 + .extracting("subject", "body", "notifyUrl", "returnUrl", "price", "expireTime")
368 .containsExactly(order.getSubject(), order.getBody(), "http://127.0.0.1/10", 367 .containsExactly(order.getSubject(), order.getBody(), "http://127.0.0.1/10",
369 -// reqVO.getReturnUrl(), order.getPrice(), order.getExpireTime());  
370 - reqVO.getReturnUrl(), order.getPrice()); 368 + reqVO.getReturnUrl(), order.getPrice(), order.getExpireTime());
371 return true; 369 return true;
372 }))).thenReturn(unifiedOrderResp); 370 }))).thenReturn(unifiedOrderResp);
373 371
@@ -396,7 +394,7 @@ public class PayOrderServiceTest extends BaseDbAndRedisUnitTest { @@ -396,7 +394,7 @@ public class PayOrderServiceTest extends BaseDbAndRedisUnitTest {
396 394
397 // mock 数据(order) 395 // mock 数据(order)
398 PayOrderDO order = randomPojo(PayOrderDO.class, o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus()) 396 PayOrderDO order = randomPojo(PayOrderDO.class, o -> o.setStatus(PayOrderStatusEnum.WAITING.getStatus())
399 - .setAppId(1L).setExpireTime(addTime(Duration.ofDays(1)))); 397 + .setAppId(1L).setExpireTime(addTime(Duration.ofDays(1)).withNano(0)));
400 orderMapper.insert(order); 398 orderMapper.insert(order);
401 // 准备参数 399 // 准备参数
402 PayOrderSubmitReqVO reqVO = randomPojo(PayOrderSubmitReqVO.class, o -> o.setId(order.getId()) 400 PayOrderSubmitReqVO reqVO = randomPojo(PayOrderSubmitReqVO.class, o -> o.setId(order.getId())
@@ -419,11 +417,9 @@ public class PayOrderServiceTest extends BaseDbAndRedisUnitTest { @@ -419,11 +417,9 @@ public class PayOrderServiceTest extends BaseDbAndRedisUnitTest {
419 when(client.unifiedOrder(argThat(payOrderUnifiedReqDTO -> { 417 when(client.unifiedOrder(argThat(payOrderUnifiedReqDTO -> {
420 assertNotNull(payOrderUnifiedReqDTO.getOutTradeNo()); 418 assertNotNull(payOrderUnifiedReqDTO.getOutTradeNo());
421 assertThat(payOrderUnifiedReqDTO) 419 assertThat(payOrderUnifiedReqDTO)
422 -// .extracting("subject", "body", "notifyUrl", "returnUrl", "price", "expireTime") // TODO @芋艿:win11 下,时间不太准  
423 - .extracting("subject", "body", "notifyUrl", "returnUrl", "price") 420 + .extracting("subject", "body", "notifyUrl", "returnUrl", "price", "expireTime")
424 .containsExactly(order.getSubject(), order.getBody(), "http://127.0.0.1/10", 421 .containsExactly(order.getSubject(), order.getBody(), "http://127.0.0.1/10",
425 -// reqVO.getReturnUrl(), order.getPrice(), order.getExpireTime());  
426 - reqVO.getReturnUrl(), order.getPrice()); 422 + reqVO.getReturnUrl(), order.getPrice(), order.getExpireTime());
427 return true; 423 return true;
428 }))).thenReturn(unifiedOrderResp); 424 }))).thenReturn(unifiedOrderResp);
429 425
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/oauth2/OAuth2ApproveServiceImplTest.java
@@ -202,7 +202,7 @@ public class OAuth2ApproveServiceImplTest extends BaseDbUnitTest { @@ -202,7 +202,7 @@ public class OAuth2ApproveServiceImplTest extends BaseDbUnitTest {
202 String clientId = randomString(); 202 String clientId = randomString();
203 // mock 数据 203 // mock 数据
204 OAuth2ApproveDO approve = randomPojo(OAuth2ApproveDO.class).setUserId(userId) 204 OAuth2ApproveDO approve = randomPojo(OAuth2ApproveDO.class).setUserId(userId)
205 - .setUserType(userType).setClientId(clientId).setExpiresTime(LocalDateTimeUtil.offset(LocalDateTime.now(), 1L, ChronoUnit.DAYS)); 205 + .setUserType(userType).setClientId(clientId).setExpiresTime(LocalDateTimeUtil.offset(LocalDateTime.now(), 1L, ChronoUnit.DAYS).withNano(0));
206 oauth2ApproveMapper.insert(approve); // 未过期 206 oauth2ApproveMapper.insert(approve); // 未过期
207 oauth2ApproveMapper.insert(ObjectUtil.clone(approve).setId(null) 207 oauth2ApproveMapper.insert(ObjectUtil.clone(approve).setId(null)
208 .setExpiresTime(LocalDateTimeUtil.offset(LocalDateTime.now(), -1L, ChronoUnit.DAYS))); // 已过期 208 .setExpiresTime(LocalDateTimeUtil.offset(LocalDateTime.now(), -1L, ChronoUnit.DAYS))); // 已过期
@@ -211,8 +211,7 @@ public class OAuth2ApproveServiceImplTest extends BaseDbUnitTest { @@ -211,8 +211,7 @@ public class OAuth2ApproveServiceImplTest extends BaseDbUnitTest {
211 List<OAuth2ApproveDO> result = oauth2ApproveService.getApproveList(userId, userType, clientId); 211 List<OAuth2ApproveDO> result = oauth2ApproveService.getApproveList(userId, userType, clientId);
212 // 断言 212 // 断言
213 assertEquals(1, result.size()); 213 assertEquals(1, result.size());
214 - // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。  
215 - assertPojoEquals(approve, result.get(0), "expiresTime"); 214 + assertPojoEquals(approve, result.get(0));
216 } 215 }
217 216
218 @Test 217 @Test
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/oauth2/OAuth2CodeServiceImplTest.java
@@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2CodeDO; @@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2CodeDO;
8 import cn.iocoder.yudao.module.system.dal.mysql.oauth2.OAuth2CodeMapper; 8 import cn.iocoder.yudao.module.system.dal.mysql.oauth2.OAuth2CodeMapper;
9 import org.assertj.core.util.Lists; 9 import org.assertj.core.util.Lists;
10 import org.junit.jupiter.api.Test; 10 import org.junit.jupiter.api.Test;
  11 +import org.mockito.MockedStatic;
11 import org.springframework.context.annotation.Import; 12 import org.springframework.context.annotation.Import;
12 13
13 import jakarta.annotation.Resource; 14 import jakarta.annotation.Resource;
@@ -20,6 +21,8 @@ import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; @@ -20,6 +21,8 @@ import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
20 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.OAUTH2_CODE_EXPIRE; 21 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.OAUTH2_CODE_EXPIRE;
21 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.OAUTH2_CODE_NOT_EXISTS; 22 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.OAUTH2_CODE_NOT_EXISTS;
22 import static org.junit.jupiter.api.Assertions.*; 23 import static org.junit.jupiter.api.Assertions.*;
  24 +import static org.mockito.Mockito.CALLS_REAL_METHODS;
  25 +import static org.mockito.Mockito.mockStatic;
23 26
24 /** 27 /**
25 * {@link OAuth2CodeServiceImpl} 的单元测试类 28 * {@link OAuth2CodeServiceImpl} 的单元测试类
@@ -44,20 +47,25 @@ class OAuth2CodeServiceImplTest extends BaseDbUnitTest { @@ -44,20 +47,25 @@ class OAuth2CodeServiceImplTest extends BaseDbUnitTest {
44 List<String> scopes = Lists.newArrayList("read", "write"); 47 List<String> scopes = Lists.newArrayList("read", "write");
45 String redirectUri = randomString(); 48 String redirectUri = randomString();
46 String state = randomString(); 49 String state = randomString();
  50 + LocalDateTime now = LocalDateTime.now().withNano(0);
47 51
48 // 调用 52 // 调用
49 - OAuth2CodeDO codeDO = oauth2CodeService.createAuthorizationCode(userId, userType, clientId,  
50 - scopes, redirectUri, state); 53 + OAuth2CodeDO codeDO;
  54 + try (MockedStatic<LocalDateTime> mockedTime = mockStatic(LocalDateTime.class, CALLS_REAL_METHODS)) {
  55 + mockedTime.when(LocalDateTime::now).thenReturn(now);
  56 + codeDO = oauth2CodeService.createAuthorizationCode(userId, userType, clientId,
  57 + scopes, redirectUri, state);
  58 + }
51 // 断言 59 // 断言
52 OAuth2CodeDO dbCodeDO = oauth2CodeMapper.selectByCode(codeDO.getCode()); 60 OAuth2CodeDO dbCodeDO = oauth2CodeMapper.selectByCode(codeDO.getCode());
53 - // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。  
54 - assertPojoEquals(codeDO, dbCodeDO, "expiresTime", "createTime", "updateTime", "deleted"); 61 + assertPojoEquals(codeDO, dbCodeDO, "createTime", "updateTime", "deleted");
55 assertEquals(userId, codeDO.getUserId()); 62 assertEquals(userId, codeDO.getUserId());
56 assertEquals(userType, codeDO.getUserType()); 63 assertEquals(userType, codeDO.getUserType());
57 assertEquals(clientId, codeDO.getClientId()); 64 assertEquals(clientId, codeDO.getClientId());
58 assertEquals(scopes, codeDO.getScopes()); 65 assertEquals(scopes, codeDO.getScopes());
59 assertEquals(redirectUri, codeDO.getRedirectUri()); 66 assertEquals(redirectUri, codeDO.getRedirectUri());
60 assertEquals(state, codeDO.getState()); 67 assertEquals(state, codeDO.getState());
  68 + assertEquals(now.plusMinutes(5), codeDO.getExpiresTime());
61 assertFalse(DateUtils.isExpired(codeDO.getExpiresTime())); 69 assertFalse(DateUtils.isExpired(codeDO.getExpiresTime()));
62 } 70 }
63 71
@@ -88,13 +96,12 @@ class OAuth2CodeServiceImplTest extends BaseDbUnitTest { @@ -88,13 +96,12 @@ class OAuth2CodeServiceImplTest extends BaseDbUnitTest {
88 String code = "test_code"; 96 String code = "test_code";
89 // mock 数据 97 // mock 数据
90 OAuth2CodeDO codeDO = randomPojo(OAuth2CodeDO.class).setCode(code) 98 OAuth2CodeDO codeDO = randomPojo(OAuth2CodeDO.class).setCode(code)
91 - .setExpiresTime(LocalDateTime.now().plusDays(1)); 99 + .setExpiresTime(LocalDateTime.now().plusDays(1).withNano(0));
92 oauth2CodeMapper.insert(codeDO); 100 oauth2CodeMapper.insert(codeDO);
93 101
94 // 调用 102 // 调用
95 OAuth2CodeDO result = oauth2CodeService.consumeAuthorizationCode(code); 103 OAuth2CodeDO result = oauth2CodeService.consumeAuthorizationCode(code);
96 - // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。  
97 - assertPojoEquals(codeDO, result, "expiresTime"); 104 + assertPojoEquals(codeDO, result);
98 assertNull(oauth2CodeMapper.selectByCode(code)); 105 assertNull(oauth2CodeMapper.selectByCode(code));
99 } 106 }
100 107
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/oauth2/OAuth2TokenServiceImplTest.java
@@ -19,6 +19,7 @@ import cn.iocoder.yudao.module.system.service.user.AdminUserService; @@ -19,6 +19,7 @@ import cn.iocoder.yudao.module.system.service.user.AdminUserService;
19 import jakarta.annotation.Resource; 19 import jakarta.annotation.Resource;
20 import org.assertj.core.util.Lists; 20 import org.assertj.core.util.Lists;
21 import org.junit.jupiter.api.Test; 21 import org.junit.jupiter.api.Test;
  22 +import org.mockito.MockedStatic;
22 import org.springframework.context.annotation.Import; 23 import org.springframework.context.annotation.Import;
23 import org.springframework.test.context.bean.override.mockito.MockitoBean; 24 import org.springframework.test.context.bean.override.mockito.MockitoBean;
24 25
@@ -31,6 +32,8 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServic @@ -31,6 +32,8 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServic
31 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; 32 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
32 import static org.junit.jupiter.api.Assertions.*; 33 import static org.junit.jupiter.api.Assertions.*;
33 import static org.mockito.ArgumentMatchers.eq; 34 import static org.mockito.ArgumentMatchers.eq;
  35 +import static org.mockito.Mockito.CALLS_REAL_METHODS;
  36 +import static org.mockito.Mockito.mockStatic;
34 import static org.mockito.Mockito.when; 37 import static org.mockito.Mockito.when;
35 38
36 /** 39 /**
@@ -65,6 +68,7 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest { @@ -65,6 +68,7 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest {
65 Integer userType = UserTypeEnum.ADMIN.getValue(); 68 Integer userType = UserTypeEnum.ADMIN.getValue();
66 String clientId = randomString(); 69 String clientId = randomString();
67 List<String> scopes = Lists.newArrayList("read", "write"); 70 List<String> scopes = Lists.newArrayList("read", "write");
  71 + LocalDateTime now = LocalDateTime.now().withNano(0);
68 // mock 方法 72 // mock 方法
69 OAuth2ClientDO clientDO = randomPojo(OAuth2ClientDO.class).setClientId(clientId) 73 OAuth2ClientDO clientDO = randomPojo(OAuth2ClientDO.class).setClientId(clientId)
70 .setAccessTokenValiditySeconds(30).setRefreshTokenValiditySeconds(60); 74 .setAccessTokenValiditySeconds(30).setRefreshTokenValiditySeconds(60);
@@ -74,11 +78,14 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest { @@ -74,11 +78,14 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest {
74 when(adminUserService.getUser(userId)).thenReturn(user); 78 when(adminUserService.getUser(userId)).thenReturn(user);
75 79
76 // 调用 80 // 调用
77 - OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken(userId, userType, clientId, scopes); 81 + OAuth2AccessTokenDO accessTokenDO;
  82 + try (MockedStatic<LocalDateTime> mockedTime = mockStatic(LocalDateTime.class, CALLS_REAL_METHODS)) {
  83 + mockedTime.when(LocalDateTime::now).thenReturn(now);
  84 + accessTokenDO = oauth2TokenService.createAccessToken(userId, userType, clientId, scopes);
  85 + }
78 // 断言访问令牌 86 // 断言访问令牌
79 OAuth2AccessTokenDO dbAccessTokenDO = oauth2AccessTokenMapper.selectByAccessToken(accessTokenDO.getAccessToken()); 87 OAuth2AccessTokenDO dbAccessTokenDO = oauth2AccessTokenMapper.selectByAccessToken(accessTokenDO.getAccessToken());
80 - // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。  
81 - assertPojoEquals(accessTokenDO, dbAccessTokenDO, "expiresTime", "createTime", "updateTime", "deleted"); 88 + assertPojoEquals(accessTokenDO, dbAccessTokenDO, "createTime", "updateTime", "deleted");
82 assertEquals(userId, accessTokenDO.getUserId()); 89 assertEquals(userId, accessTokenDO.getUserId());
83 assertEquals(userType, accessTokenDO.getUserType()); 90 assertEquals(userType, accessTokenDO.getUserType());
84 assertEquals(2, accessTokenDO.getUserInfo().size()); 91 assertEquals(2, accessTokenDO.getUserInfo().size());
@@ -86,14 +93,15 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest { @@ -86,14 +93,15 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest {
86 assertEquals(user.getDeptId().toString(), accessTokenDO.getUserInfo().get("deptId")); 93 assertEquals(user.getDeptId().toString(), accessTokenDO.getUserInfo().get("deptId"));
87 assertEquals(clientId, accessTokenDO.getClientId()); 94 assertEquals(clientId, accessTokenDO.getClientId());
88 assertEquals(scopes, accessTokenDO.getScopes()); 95 assertEquals(scopes, accessTokenDO.getScopes());
  96 + assertEquals(now.plusSeconds(30), accessTokenDO.getExpiresTime());
89 assertFalse(DateUtils.isExpired(accessTokenDO.getExpiresTime())); 97 assertFalse(DateUtils.isExpired(accessTokenDO.getExpiresTime()));
90 // 断言访问令牌的缓存 98 // 断言访问令牌的缓存
91 OAuth2AccessTokenDO redisAccessTokenDO = oauth2AccessTokenRedisDAO.get(accessTokenDO.getAccessToken()); 99 OAuth2AccessTokenDO redisAccessTokenDO = oauth2AccessTokenRedisDAO.get(accessTokenDO.getAccessToken());
92 - // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。  
93 - assertPojoEquals(accessTokenDO, redisAccessTokenDO, "expiresTime", "createTime", "updateTime", "deleted"); 100 + assertPojoEquals(accessTokenDO, redisAccessTokenDO, "createTime", "updateTime", "deleted");
94 // 断言刷新令牌 101 // 断言刷新令牌
95 OAuth2RefreshTokenDO refreshTokenDO = oauth2RefreshTokenMapper.selectList().get(0); 102 OAuth2RefreshTokenDO refreshTokenDO = oauth2RefreshTokenMapper.selectList().get(0);
96 assertPojoEquals(accessTokenDO, refreshTokenDO, "id", "expiresTime", "createTime", "updateTime", "deleted"); 103 assertPojoEquals(accessTokenDO, refreshTokenDO, "id", "expiresTime", "createTime", "updateTime", "deleted");
  104 + assertEquals(now.plusSeconds(60), refreshTokenDO.getExpiresTime());
97 assertFalse(DateUtils.isExpired(refreshTokenDO.getExpiresTime())); 105 assertFalse(DateUtils.isExpired(refreshTokenDO.getExpiresTime()));
98 } 106 }
99 107
@@ -153,6 +161,7 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest { @@ -153,6 +161,7 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest {
153 // 准备参数 161 // 准备参数
154 String refreshToken = randomString(); 162 String refreshToken = randomString();
155 String clientId = randomString(); 163 String clientId = randomString();
  164 + LocalDateTime now = LocalDateTime.now().withNano(0);
156 // mock 方法 165 // mock 方法
157 OAuth2ClientDO clientDO = randomPojo(OAuth2ClientDO.class).setClientId(clientId) 166 OAuth2ClientDO clientDO = randomPojo(OAuth2ClientDO.class).setClientId(clientId)
158 .setAccessTokenValiditySeconds(30); 167 .setAccessTokenValiditySeconds(30);
@@ -174,28 +183,31 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest { @@ -174,28 +183,31 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest {
174 when(adminUserService.getUser(refreshTokenDO.getUserId())).thenReturn(user); 183 when(adminUserService.getUser(refreshTokenDO.getUserId())).thenReturn(user);
175 184
176 // 调用 185 // 调用
177 - OAuth2AccessTokenDO newAccessTokenDO = oauth2TokenService.refreshAccessToken(refreshToken, clientId); 186 + OAuth2AccessTokenDO newAccessTokenDO;
  187 + try (MockedStatic<LocalDateTime> mockedTime = mockStatic(LocalDateTime.class, CALLS_REAL_METHODS)) {
  188 + mockedTime.when(LocalDateTime::now).thenReturn(now);
  189 + newAccessTokenDO = oauth2TokenService.refreshAccessToken(refreshToken, clientId);
  190 + }
178 // 断言,老的访问令牌被删除 191 // 断言,老的访问令牌被删除
179 assertNull(oauth2AccessTokenMapper.selectByAccessToken(accessTokenDO.getAccessToken())); 192 assertNull(oauth2AccessTokenMapper.selectByAccessToken(accessTokenDO.getAccessToken()));
180 assertNull(oauth2AccessTokenRedisDAO.get(accessTokenDO.getAccessToken())); 193 assertNull(oauth2AccessTokenRedisDAO.get(accessTokenDO.getAccessToken()));
181 // 断言,新的访问令牌 194 // 断言,新的访问令牌
182 OAuth2AccessTokenDO dbAccessTokenDO = oauth2AccessTokenMapper.selectByAccessToken(newAccessTokenDO.getAccessToken()); 195 OAuth2AccessTokenDO dbAccessTokenDO = oauth2AccessTokenMapper.selectByAccessToken(newAccessTokenDO.getAccessToken());
183 - // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。  
184 - assertPojoEquals(newAccessTokenDO, dbAccessTokenDO, "expiresTime", "createTime", "updateTime", "deleted"); 196 + assertPojoEquals(newAccessTokenDO, dbAccessTokenDO, "createTime", "updateTime", "deleted");
185 assertPojoEquals(newAccessTokenDO, refreshTokenDO, "id", "expiresTime", "createTime", "updateTime", "deleted", 197 assertPojoEquals(newAccessTokenDO, refreshTokenDO, "id", "expiresTime", "createTime", "updateTime", "deleted",
186 "creator", "updater"); 198 "creator", "updater");
  199 + assertEquals(now.plusSeconds(30), newAccessTokenDO.getExpiresTime());
187 assertFalse(DateUtils.isExpired(newAccessTokenDO.getExpiresTime())); 200 assertFalse(DateUtils.isExpired(newAccessTokenDO.getExpiresTime()));
188 // 断言,新的访问令牌的缓存 201 // 断言,新的访问令牌的缓存
189 OAuth2AccessTokenDO redisAccessTokenDO = oauth2AccessTokenRedisDAO.get(newAccessTokenDO.getAccessToken()); 202 OAuth2AccessTokenDO redisAccessTokenDO = oauth2AccessTokenRedisDAO.get(newAccessTokenDO.getAccessToken());
190 - // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。  
191 - assertPojoEquals(newAccessTokenDO, redisAccessTokenDO, "expiresTime", "createTime", "updateTime", "deleted"); 203 + assertPojoEquals(newAccessTokenDO, redisAccessTokenDO, "createTime", "updateTime", "deleted");
192 } 204 }
193 205
194 @Test 206 @Test
195 public void testGetAccessToken() { 207 public void testGetAccessToken() {
196 // mock 数据(访问令牌) 208 // mock 数据(访问令牌)
197 OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class) 209 OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class)
198 - .setExpiresTime(LocalDateTime.now().plusDays(1)); 210 + .setExpiresTime(LocalDateTime.now().plusDays(1).withNano(0));
199 oauth2AccessTokenMapper.insert(accessTokenDO); 211 oauth2AccessTokenMapper.insert(accessTokenDO);
200 // 准备参数 212 // 准备参数
201 String accessToken = accessTokenDO.getAccessToken(); 213 String accessToken = accessTokenDO.getAccessToken();
@@ -203,11 +215,9 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest { @@ -203,11 +215,9 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest {
203 // 调用 215 // 调用
204 OAuth2AccessTokenDO result = oauth2TokenService.getAccessToken(accessToken); 216 OAuth2AccessTokenDO result = oauth2TokenService.getAccessToken(accessToken);
205 // 断言 217 // 断言
206 - // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。  
207 - assertPojoEquals(accessTokenDO, result, "expiresTime", "createTime", "updateTime", "deleted", 218 + assertPojoEquals(accessTokenDO, result, "createTime", "updateTime", "deleted",
208 "creator", "updater"); 219 "creator", "updater");
209 - // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。  
210 - assertPojoEquals(accessTokenDO, oauth2AccessTokenRedisDAO.get(accessToken), "expiresTime", "createTime", "updateTime", "deleted", 220 + assertPojoEquals(accessTokenDO, oauth2AccessTokenRedisDAO.get(accessToken), "createTime", "updateTime", "deleted",
211 "creator", "updater"); 221 "creator", "updater");
212 } 222 }
213 223
@@ -253,7 +263,7 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest { @@ -253,7 +263,7 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest {
253 public void testCheckAccessToken_success() { 263 public void testCheckAccessToken_success() {
254 // mock 数据(访问令牌) 264 // mock 数据(访问令牌)
255 OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class) 265 OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class)
256 - .setExpiresTime(LocalDateTime.now().plusDays(1)); 266 + .setExpiresTime(LocalDateTime.now().plusDays(1).withNano(0));
257 oauth2AccessTokenMapper.insert(accessTokenDO); 267 oauth2AccessTokenMapper.insert(accessTokenDO);
258 // 准备参数 268 // 准备参数
259 String accessToken = accessTokenDO.getAccessToken(); 269 String accessToken = accessTokenDO.getAccessToken();
@@ -261,8 +271,7 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest { @@ -261,8 +271,7 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest {
261 // 调研,并断言 271 // 调研,并断言
262 OAuth2AccessTokenDO result = oauth2TokenService.getAccessToken(accessToken); 272 OAuth2AccessTokenDO result = oauth2TokenService.getAccessToken(accessToken);
263 // 断言 273 // 断言
264 - // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。  
265 - assertPojoEquals(accessTokenDO, result, "expiresTime", "createTime", "updateTime", "deleted", 274 + assertPojoEquals(accessTokenDO, result, "createTime", "updateTime", "deleted",
266 "creator", "updater"); 275 "creator", "updater");
267 } 276 }
268 277
@@ -276,7 +285,7 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest { @@ -276,7 +285,7 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest {
276 public void testRemoveAccessToken_success() { 285 public void testRemoveAccessToken_success() {
277 // mock 数据(访问令牌) 286 // mock 数据(访问令牌)
278 OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class) 287 OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class)
279 - .setExpiresTime(LocalDateTime.now().plusDays(1)); 288 + .setExpiresTime(LocalDateTime.now().plusDays(1).withNano(0));
280 oauth2AccessTokenMapper.insert(accessTokenDO); 289 oauth2AccessTokenMapper.insert(accessTokenDO);
281 // mock 数据(刷新令牌) 290 // mock 数据(刷新令牌)
282 OAuth2RefreshTokenDO refreshTokenDO = randomPojo(OAuth2RefreshTokenDO.class) 291 OAuth2RefreshTokenDO refreshTokenDO = randomPojo(OAuth2RefreshTokenDO.class)
@@ -284,8 +293,7 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest { @@ -284,8 +293,7 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest {
284 oauth2RefreshTokenMapper.insert(refreshTokenDO); 293 oauth2RefreshTokenMapper.insert(refreshTokenDO);
285 // 调用 294 // 调用
286 OAuth2AccessTokenDO result = oauth2TokenService.removeAccessToken(accessTokenDO.getAccessToken()); 295 OAuth2AccessTokenDO result = oauth2TokenService.removeAccessToken(accessTokenDO.getAccessToken());
287 - // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。  
288 - assertPojoEquals(accessTokenDO, result, "expiresTime", "createTime", "updateTime", "deleted", 296 + assertPojoEquals(accessTokenDO, result, "createTime", "updateTime", "deleted",
289 "creator", "updater"); 297 "creator", "updater");
290 // 断言数据 298 // 断言数据
291 assertNull(oauth2AccessTokenMapper.selectByAccessToken(accessTokenDO.getAccessToken())); 299 assertNull(oauth2AccessTokenMapper.selectByAccessToken(accessTokenDO.getAccessToken()));
@@ -301,7 +309,7 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest { @@ -301,7 +309,7 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest {
301 o.setUserId(10L); 309 o.setUserId(10L);
302 o.setUserType(1); 310 o.setUserType(1);
303 o.setClientId("test_client"); 311 o.setClientId("test_client");
304 - o.setExpiresTime(LocalDateTime.now().plusDays(1)); 312 + o.setExpiresTime(LocalDateTime.now().plusDays(1).withNano(0));
305 }); 313 });
306 oauth2AccessTokenMapper.insert(dbAccessToken); 314 oauth2AccessTokenMapper.insert(dbAccessToken);
307 // 测试 userId 不匹配 315 // 测试 userId 不匹配
@@ -323,8 +331,7 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest { @@ -323,8 +331,7 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest {
323 // 断言 331 // 断言
324 assertEquals(1, pageResult.getTotal()); 332 assertEquals(1, pageResult.getTotal());
325 assertEquals(1, pageResult.getList().size()); 333 assertEquals(1, pageResult.getList().size());
326 - // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。  
327 - assertPojoEquals(dbAccessToken, pageResult.getList().get(0), "expiresTime"); 334 + assertPojoEquals(dbAccessToken, pageResult.getList().get(0));
328 } 335 }
329 336
330 } 337 }