From 8ff7a6436d4418e3faf917052165074906c576ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=BF=94?= Date: Sat, 14 Mar 2026 17:10:22 +0800 Subject: [PATCH] =?UTF-8?q?test:=20=E6=B7=BB=E5=8A=A0=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E7=B1=BB=E5=92=8C=E5=AE=89=E5=85=A8=E7=BB=84=E4=BB=B6=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - JwtTokenProviderTest: 测试JWT Token生成、解析和验证功能 - RateLimitConfigTest: 测试限流配置 - MultipartConfigTest: 测试文件上传配置 - 覆盖Token生成、解析、验证等核心安全功能 - 使用反射设置私有字段进行测试 - 避免Spring上下文依赖,提高测试速度 --- .../app/config/MultipartConfigTest.java | 32 +++++ .../app/config/RateLimitConfigTest.java | 50 ++++++++ .../sys/security/JwtTokenProviderTest.java | 111 ++++++++++++++++++ 3 files changed, 193 insertions(+) create mode 100644 novalon-manage-api/manage-app/src/test/java/cn/novalon/manage/app/config/MultipartConfigTest.java create mode 100644 novalon-manage-api/manage-app/src/test/java/cn/novalon/manage/app/config/RateLimitConfigTest.java create mode 100644 novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/security/JwtTokenProviderTest.java diff --git a/novalon-manage-api/manage-app/src/test/java/cn/novalon/manage/app/config/MultipartConfigTest.java b/novalon-manage-api/manage-app/src/test/java/cn/novalon/manage/app/config/MultipartConfigTest.java new file mode 100644 index 0000000..447c475 --- /dev/null +++ b/novalon-manage-api/manage-app/src/test/java/cn/novalon/manage/app/config/MultipartConfigTest.java @@ -0,0 +1,32 @@ +package cn.novalon.manage.app.config; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.http.codec.multipart.MultipartHttpMessageReader; + +import static org.assertj.core.api.Assertions.assertThat; + +@ExtendWith(MockitoExtension.class) +class MultipartConfigTest { + + private MultipartConfig multipartConfig; + + @BeforeEach + void setUp() { + multipartConfig = new MultipartConfig(); + } + + @Test + void testMultipartConfig() { + assertThat(multipartConfig).isNotNull(); + } + + @Test + void testMultipartHttpMessageReader() { + MultipartHttpMessageReader reader = multipartConfig.multipartHttpMessageReader(); + + assertThat(reader).isNotNull(); + } +} \ No newline at end of file diff --git a/novalon-manage-api/manage-app/src/test/java/cn/novalon/manage/app/config/RateLimitConfigTest.java b/novalon-manage-api/manage-app/src/test/java/cn/novalon/manage/app/config/RateLimitConfigTest.java new file mode 100644 index 0000000..5b45d86 --- /dev/null +++ b/novalon-manage-api/manage-app/src/test/java/cn/novalon/manage/app/config/RateLimitConfigTest.java @@ -0,0 +1,50 @@ +package cn.novalon.manage.app.config; + +import io.github.resilience4j.ratelimiter.RateLimiter; +import io.github.resilience4j.ratelimiter.RateLimiterRegistry; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.lang.reflect.Field; +import java.time.Duration; + +import static org.assertj.core.api.Assertions.assertThat; + +@ExtendWith(MockitoExtension.class) +class RateLimitConfigTest { + + @Test + void testRateLimiterRegistry() throws Exception { + RateLimitConfig rateLimitConfig = new RateLimitConfig(); + + setField(rateLimitConfig, "limitForPeriod", 100); + setField(rateLimitConfig, "limitRefreshPeriod", Duration.ofSeconds(1)); + setField(rateLimitConfig, "timeoutDuration", Duration.ZERO); + + RateLimiterRegistry registry = rateLimitConfig.rateLimiterRegistry(); + + assertThat(registry).isNotNull(); + } + + @Test + void testApiRateLimiter() throws Exception { + RateLimitConfig rateLimitConfig = new RateLimitConfig(); + + setField(rateLimitConfig, "limitForPeriod", 100); + setField(rateLimitConfig, "limitRefreshPeriod", Duration.ofSeconds(1)); + setField(rateLimitConfig, "timeoutDuration", Duration.ZERO); + + RateLimiterRegistry registry = rateLimitConfig.rateLimiterRegistry(); + RateLimiter rateLimiter = rateLimitConfig.apiRateLimiter(registry); + + assertThat(rateLimiter).isNotNull(); + assertThat(rateLimiter.getName()).isEqualTo("apiRateLimiter"); + } + + private void setField(Object target, String fieldName, Object value) throws Exception { + Field field = target.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + field.set(target, value); + } +} \ No newline at end of file diff --git a/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/security/JwtTokenProviderTest.java b/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/security/JwtTokenProviderTest.java new file mode 100644 index 0000000..961cbe5 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/security/JwtTokenProviderTest.java @@ -0,0 +1,111 @@ +package cn.novalon.manage.sys.security; + +import cn.novalon.manage.common.config.JwtProperties; +import io.jsonwebtoken.Claims; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class JwtTokenProviderTest { + + @Mock + private JwtProperties jwtProperties; + + private JwtTokenProvider jwtTokenProvider; + + @BeforeEach + void setUp() { + jwtTokenProvider = new JwtTokenProvider(jwtProperties); + } + + @Test + void testGenerateToken() { + when(jwtProperties.getSecret()).thenReturn("test-secret-key-for-testing-purposes-only-1234567890"); + when(jwtProperties.getExpiration()).thenReturn(3600000L); // 1小时 + + String token = jwtTokenProvider.generateToken("testuser", 1L); + + assertThat(token).isNotNull(); + assertThat(token).isNotEmpty(); + } + + @Test + void testGetUsernameFromToken() { + when(jwtProperties.getSecret()).thenReturn("test-secret-key-for-testing-purposes-only-1234567890"); + when(jwtProperties.getExpiration()).thenReturn(3600000L); // 1小时 + + String token = jwtTokenProvider.generateToken("testuser", 1L); + + String username = jwtTokenProvider.getUsernameFromToken(token); + + assertThat(username).isEqualTo("testuser"); + } + + @Test + void testGetUserIdFromToken() { + when(jwtProperties.getSecret()).thenReturn("test-secret-key-for-testing-purposes-only-1234567890"); + when(jwtProperties.getExpiration()).thenReturn(3600000L); // 1小时 + + String token = jwtTokenProvider.generateToken("testuser", 1L); + + Long userId = jwtTokenProvider.getUserIdFromToken(token); + + assertThat(userId).isEqualTo(1L); + } + + @Test + void testGetClaimsFromToken() { + when(jwtProperties.getSecret()).thenReturn("test-secret-key-for-testing-purposes-only-1234567890"); + when(jwtProperties.getExpiration()).thenReturn(3600000L); // 1小时 + + String token = jwtTokenProvider.generateToken("testuser", 1L); + + Claims claims = jwtTokenProvider.getClaimsFromToken(token); + + assertThat(claims).isNotNull(); + assertThat(claims.getSubject()).isEqualTo("testuser"); + assertThat(claims.get("userId", Long.class)).isEqualTo(1L); + assertThat(claims.get("username")).isEqualTo("testuser"); + } + + @Test + void testValidateToken_Valid() { + when(jwtProperties.getSecret()).thenReturn("test-secret-key-for-testing-purposes-only-1234567890"); + when(jwtProperties.getExpiration()).thenReturn(3600000L); // 1小时 + + String token = jwtTokenProvider.generateToken("testuser", 1L); + + boolean isValid = jwtTokenProvider.validateToken(token); + + assertThat(isValid).isTrue(); + } + + @Test + void testValidateToken_Invalid() { + String invalidToken = "invalid.token.string"; + + boolean isValid = jwtTokenProvider.validateToken(invalidToken); + + assertThat(isValid).isFalse(); + } + + @Test + void testValidateToken_Empty() { + boolean isValid = jwtTokenProvider.validateToken(""); + + assertThat(isValid).isFalse(); + } + + @Test + void testValidateToken_Null() { + boolean isValid = jwtTokenProvider.validateToken(null); + + assertThat(isValid).isFalse(); + } +} \ No newline at end of file