COUNTRY_CODE = Arrays.asList("JPN", "KOR", "THA", "SGP", "CHN", "TWN", "HKG", "MAC", "999");
-
- /**
- * 国名を国コードに変換
- *
- * @param country JPN:日本、KOR:韓国、THA:タイ、SGP:シンガポール、CHN:中国内陸、TWN:中国台湾、HKG:中国香港、MAC:マカオ、999:その他、0:不明
- * @return code byte
- * 1 0 1 0 1 1 1 1 1
- * 日本 韓国 タイ シンガポール 中国内陸 台湾 香港 マカオ その他
- *
- * 右→左:0位:その他、1位:マカオ、2位:香港、3位:台湾、4位:中国内陸、5位:シンガポール、6位:タイ、7位:韓国、8位:日本
- *
1:当該国で表示、0:当該国表示しない
- *
- */
- public static byte countryToCodeByte(String country) {
- String code = countryToCode(country);
- return (byte) Integer.parseInt(code, 2);
- }
-
- /**
- * 国家代码转換成二进制
- *
- * @param country JPN:日本、KOR:韓国、THA:泰国、CHN:中国内陸、SGP:新加坡、TWN:中国台湾、HKG:中国香港、MAC:中国澳门、999:其他、0:不明
- * @return
- * 1 0 1 0 1 1 1 1 1
- * 日本 韓国 泰国 新加坡 中国内陸 台湾 香港 澳门 其他
- *
- * 右→左:0位:其他、1位:中国澳门、2位:中国香港、3位:中国台湾、4位:中国内陸、5位:新加坡、6位:泰国、7位:韓国、8位:日本
- *
1:在该国表示、0:不表示该国
- *
- */
- public static String countryToCode(String country) {
- int index = COUNTRY_CODE.indexOf(country);
- if (index == -1) {
- return "000000000";
- }
- int bn = 1 << (COUNTRY_CODE.size() - 1 - index);
- // 转成二进制
- String bs = Integer.toBinaryString(bn);
- // 为了保证长度一致,前面补0
- return String.format("%09d", Integer.parseInt(bs));
- }
-
- /**
- * 国家代码二进制转国家代码
- *
- * @param countryCode 国家代码二进制转:010000000
- *
- * 1 0 1 0 1 1 1 1 1
- * 日本 韓国 泰国 新加坡 中国内陸 台湾 香港 澳门 其他
- *
- * 右→左:0位:其他、1位:中国澳门、2位:中国香港、3位:中国台湾、4位:中国内陸、5位:新加坡、6位:泰国、7位:韓国、8位:日本
- *
1:在该国表示、0:不表示该国
- *
- * @return JPN:日本、KOR:韓国、THA:泰国、CHN:中国内陸、SGP:新加坡、TWN:中国台湾、HKG:中国香港、MAC:中国澳门、999:其他、0:不明
- */
- public static String getCountryByCode(String countryCode) {
- int i = Integer.parseInt(countryCode, 2);
- int index = Integer.numberOfTrailingZeros(i);
- if (index > COUNTRY_CODE.size()) {
- return "O";
- }
- return COUNTRY_CODE.get(COUNTRY_CODE.size() - 1 - index);
- }
-
- /**
- * nationalCodeは想定国エリア範囲内存在するかどうか
- * 想定国エリア範囲:"JPN", "KOR", "THA", "SGP", "CHN", "TWN", "HKG", "MAC", "999"
- *
- * @param nationCode
- * @return 存在:true;存在しない:false
- */
- public static boolean containsCountry(String nationCode) {
- if (isNotEmpty(nationCode)) {
- return COUNTRY_CODE.contains(nationCode);
- }
- return false;
- }
-
/**
* 将长字符串分割为多行
*
diff --git a/src/main/java/com/yexuejc/base/util/ThreeDES.java b/src/main/java/com/yexuejc/base/util/ThreeDES.java
deleted file mode 100644
index ba8e630..0000000
--- a/src/main/java/com/yexuejc/base/util/ThreeDES.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package com.yexuejc.base.util;
-
-import org.apache.commons.codec.binary.Base64;
-
-import javax.crypto.Cipher;
-import javax.crypto.SecretKeyFactory;
-import javax.crypto.spec.DESedeKeySpec;
-import javax.crypto.spec.IvParameterSpec;
-import java.io.UnsupportedEncodingException;
-import java.security.InvalidKeyException;
-import java.security.Key;
-
-
-/**
- * 3DES加解密
- *
- * @author maxf
- * @ClassName ThreeDES
- * @Description
- * @date 2018/9/3 17:09
- */
-public class ThreeDES {
- private ThreeDES() {
- }
-
- public static String IV = "1234567-";
- public static String ENCODING = "utf-8";
-
- /**
- * DESCBC加密
- *
- * @param src 数据源
- * @param key 密钥
- * @return 返回加密后的数据
- * @throws Exception
- */
- public static String encryptDESCBC(final String src, final String key) throws Exception {
- if (key.length() < 24) {
- throw new InvalidKeyException("key的length不得小于24");
- }
- Key deskey = null;
- DESedeKeySpec spec = new DESedeKeySpec(key.getBytes());
- SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
- deskey = keyfactory.generateSecret(spec);
-
- Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");
- IvParameterSpec ips = new IvParameterSpec(IV.getBytes());
- cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
- byte[] encryptData = cipher.doFinal(src.getBytes(ENCODING));
- return Base64.encodeBase64URLSafeString(encryptData);
- }
-
- /**
- * DESCBC解密
- *
- * @param src 数据源
- * @param key 密钥
- * @return 返回解密后的原始数据
- * @throws Exception
- */
- public static String decryptDESCBC(final String src, final String key) throws Exception {
- if (key.length() < 24) {
- throw new InvalidKeyException("key的length不得小于24");
- }
- Key deskey = null;
- DESedeKeySpec spec = new DESedeKeySpec(key.getBytes());
- SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
- deskey = keyfactory.generateSecret(spec);
- Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");
- IvParameterSpec ips = new IvParameterSpec(IV.getBytes());
- cipher.init(Cipher.DECRYPT_MODE, deskey, ips);
-
- byte[] decryptData = cipher.doFinal(Base64.decodeBase64(src));
-
- return new String(decryptData, ENCODING);
- }
-
- /**
- * 填充,不是8的倍数会填充成8的倍数
- *
- * @param str
- * @return
- */
- public static String padding(String str) {
- byte[] oldByteArray;
- try {
- oldByteArray = str.getBytes("UTF8");
- int numberToPad = 8 - oldByteArray.length % 8;
- byte[] newByteArray = new byte[oldByteArray.length + numberToPad];
- System.arraycopy(oldByteArray, 0, newByteArray, 0,
- oldByteArray.length);
- for (int i = oldByteArray.length; i < newByteArray.length; ++i) {
- newByteArray[i] = 0;
- }
- return new String(newByteArray, "UTF8");
- } catch (UnsupportedEncodingException e) {
- System.out.println("Crypter.padding UnsupportedEncodingException");
- }
- return null;
- }
-
-}
-
diff --git a/src/main/java/com/yexuejc/base/util/ZipUtil.java b/src/main/java/com/yexuejc/base/util/ZipUtil.java
index 34df27a..bafc312 100644
--- a/src/main/java/com/yexuejc/base/util/ZipUtil.java
+++ b/src/main/java/com/yexuejc/base/util/ZipUtil.java
@@ -60,6 +60,3 @@ public class ZipUtil {
}
}
}
-
-//checkemun key -> codeMst检索(缓存)
-//返回exception(message用区分分割文言和exp)
\ No newline at end of file
diff --git a/src/main/resources/i18n/msg_en_US.properties b/src/main/resources/i18n/msg_en_US.properties
index 475fc1b..9c80bf3 100644
--- a/src/main/resources/i18n/msg_en_US.properties
+++ b/src/main/resources/i18n/msg_en_US.properties
@@ -11,3 +11,9 @@ SIGN_FAILED=Exception occurred while signing.
CA_CONVERT_FAILED=Certificate conversion failed.
PRIVATE_READ_FAILED=Private key read failed.
PUBLIC_READ_P12_FAILED=Failed to obtain public key from PKCS12 certificate.
+FILE_NOT_EXIST=CSV file [{0}] does not exist.
+FILE_PARSE_FAILED=File [{0}] parsing failed.
+FILE_NOT_CSV_FORMAT=File [{0}] is not in CSV format.
+MD5_ALGORITHM_UNAVAILABLE=MD5 algorithm is not available.
+SHA256_ALGORITHM_UNAVAILABLE=SHA-256 algorithm is not available.
+INVALID_KEY_LENGTH=Key length must not be less than 24.
diff --git a/src/main/resources/i18n/msg_ja_JP.properties b/src/main/resources/i18n/msg_ja_JP.properties
index f74cbe8..3c2a207 100644
--- a/src/main/resources/i18n/msg_ja_JP.properties
+++ b/src/main/resources/i18n/msg_ja_JP.properties
@@ -11,3 +11,9 @@ SIGN_FAILED=\u7F72\u540D\u4E2D\u306B\u4F8B\u5916\u304C\u767A\u751F\u3057\u307E\u
CA_CONVERT_FAILED=\u8A3C\u660E\u66F8\u306E\u5909\u63DB\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002
PRIVATE_READ_FAILED=\u79D8\u5BC6\u9375\u306E\u8AAD\u307F\u53D6\u308A\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002
PUBLIC_READ_P12_FAILED=PKCS12 \u8A3C\u660E\u66F8\u304B\u3089\u516C\u958B\u9375\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002
+FILE_NOT_EXIST=CSV\u30D5\u30A1\u30A4\u30EB[{0}]\u304C\u5B58\u5728\u3057\u307E\u305B\u3093\u3002
+FILE_PARSE_FAILED=\u30D5\u30A1\u30A4\u30EB[{0}]\u306E\u89E3\u6790\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002
+FILE_NOT_CSV_FORMAT=\u30D5\u30A1\u30A4\u30EB[{0}]\u306FCSV\u5F62\u5F0F\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002
+MD5_ALGORITHM_UNAVAILABLE=MD5\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u304C\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002
+SHA256_ALGORITHM_UNAVAILABLE=SHA-256\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u304C\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002
+INVALID_KEY_LENGTH=\u30AD\u30FC\u306E\u9577\u3055\u306F24\u672A\u6E80\u3067\u3042\u3063\u3066\u306F\u306A\u308A\u307E\u305B\u3093\u3002
diff --git a/src/main/resources/i18n/msg_ko_KR.properties b/src/main/resources/i18n/msg_ko_KR.properties
index 8616565..d86afaa 100644
--- a/src/main/resources/i18n/msg_ko_KR.properties
+++ b/src/main/resources/i18n/msg_ko_KR.properties
@@ -11,3 +11,9 @@ SIGN_FAILED=\uC11C\uBA85 \uC911 \uC608\uC678 \uBC1C\uC0DD.
CA_CONVERT_FAILED=\uC778\uC99D\uC11C \uBCC0\uD658 \uC2E4\uD328.
PRIVATE_READ_FAILED=\uAC1C\uC778 \uD0A4 \uC77D\uAE30 \uC2E4\uD328.
PUBLIC_READ_P12_FAILED=PKCS12 \uC778\uC99D\uC11C\uC5D0\uC11C \uACF5\uAC1C \uD0A4\uB97C \uAC00\uC838\uC62C \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
+FILE_NOT_EXIST=CSV \uD30C\uC77C[{0}]\uC774 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
+FILE_PARSE_FAILED=\uD30C\uC77C[{0}] \uD30C\uC2F1 \uC2E4\uD328.
+FILE_NOT_CSV_FORMAT=\uD30C\uC77C[{0}]\uC740 CSV \uD615\uC2DD\uC774 \uC544\uB2D9\uB2C8\uB2E4.
+MD5_ALGORITHM_UNAVAILABLE=MD5 \uC54C\uACE0\uB9AC\uC998\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
+SHA256_ALGORITHM_UNAVAILABLE=SHA-256 \uC54C\uACE0\uB9AC\uC998\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
+INVALID_KEY_LENGTH=\uD0A4 \uAE38\uC774\uB294 24 \uBBF8\uB9CC\uC774\uC5B4\uC11C\uB294 \uC548 \uB429\uB2C8\uB2E4.
diff --git a/src/main/resources/i18n/msg_zh_CN.properties b/src/main/resources/i18n/msg_zh_CN.properties
index 584f207..10532bd 100644
--- a/src/main/resources/i18n/msg_zh_CN.properties
+++ b/src/main/resources/i18n/msg_zh_CN.properties
@@ -10,4 +10,10 @@ VERIFY_FAILED=\u6821\u9A8C\u7B7E\u540D\u65F6\u53D1\u751F\u5F02\u5E38\u3002
SIGN_FAILED=\u7B7E\u540D\u65F6\u53D1\u751F\u5F02\u5E38\u3002
CA_CONVERT_FAILED=\u8BC1\u4E66\u8F6C\u6362\u5931\u8D25\u3002
PRIVATE_READ_FAILED=\u79C1\u94A5\u8BFB\u53D6\u5931\u8D25\u3002
-PUBLIC_READ_P12_FAILED=\u65E0\u6CD5\u4ECEPKCS12\u8BC1\u4E66\u4E2D\u83B7\u53D6\u516C\u94A5\u3002
\ No newline at end of file
+PUBLIC_READ_P12_FAILED=\u65E0\u6CD5\u4ECEPKCS12\u8BC1\u4E66\u4E2D\u83B7\u53D6\u516C\u94A5\u3002
+FILE_NOT_EXIST=\u89E3\u6790\u7528\u7684csv\uFF1A [{0}] \u6587\u4EF6\u4E0D\u5B58\u5728\u3002
+FILE_PARSE_FAILED=[{0}] \u6587\u4EF6\u89E3\u6790\u5931\u8D25\u3002
+FILE_NOT_CSV_FORMAT=[{0}]\u6587\u4EF6\u4E0D\u662FCSV\u6587\u4EF6\u683C\u5F0F\u3002
+MD5_ALGORITHM_UNAVAILABLE=MD5\u7B97\u6CD5\u4E0D\u53EF\u7528\u3002
+SHA256_ALGORITHM_UNAVAILABLE=SHA-256\u7B97\u6CD5\u4E0D\u53EF\u7528\u3002
+INVALID_KEY_LENGTH=key\u7684length\u4E0D\u5F97\u5C0F\u4E8E24\u3002
\ No newline at end of file
diff --git a/src/main/resources/i18n/msg_zh_TW.properties b/src/main/resources/i18n/msg_zh_TW.properties
index b62778f..1cfdb3a 100644
--- a/src/main/resources/i18n/msg_zh_TW.properties
+++ b/src/main/resources/i18n/msg_zh_TW.properties
@@ -11,3 +11,9 @@ SIGN_FAILED=\u7C3D\u7AE0\u6642\u767C\u751F\u7570\u5E38\u3002
CA_CONVERT_FAILED=\u6191\u8B49\u8F49\u63DB\u5931\u6557\u3002
PRIVATE_READ_FAILED=\u79C1\u9470\u8B80\u53D6\u5931\u6557\u3002
PUBLIC_READ_P12_FAILED=\u7121\u6CD5\u5F9EPKCS12\u6191\u8B49\u4E2D\u53D6\u5F97\u516C\u9470\u3002
+FILE_NOT_EXIST=\u89E3\u6790\u7528\u7684CSV\uFF1A[{0}] \u6A94\u6848\u4E0D\u5B58\u5728\u3002
+FILE_PARSE_FAILED=[{0}] \u6A94\u6848\u89E3\u6790\u5931\u6557\u3002
+FILE_NOT_CSV_FORMAT=[{0}]\u6A94\u6848\u4E0D\u662FCSV\u6A94\u6848\u683C\u5F0F\u3002
+MD5_ALGORITHM_UNAVAILABLE=MD5\u6F14\u7B97\u6CD5\u4E0D\u53EF\u7528\u3002
+SHA256_ALGORITHM_UNAVAILABLE=SHA-256\u6F14\u7B97\u6CD5\u4E0D\u53EF\u7528\u3002
+INVALID_KEY_LENGTH=key\u7684length\u4E0D\u5F97\u5C0F\u65BC24\u3002
diff --git a/src/test/java/com/yexuejc/base/encrypt/RSATest.java b/src/test/java/com/yexuejc/base/encrypt/RSATest.java
index ec0f5ce..f173d86 100644
--- a/src/test/java/com/yexuejc/base/encrypt/RSATest.java
+++ b/src/test/java/com/yexuejc/base/encrypt/RSATest.java
@@ -1,7 +1,10 @@
package com.yexuejc.base.encrypt;
+import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
+import java.util.Map;
+
/**
*
* @author maxiaofeng
@@ -11,7 +14,21 @@ class RSATest {
@Test
void initKeys() {
+ /**
+ * ECDSA 密钥的位数通常定义为 NIST 曲线标准,支持的常见密钥尺寸包括:
+ *
+ * 曲线名称 密钥位数(bits)
+ * P-256 (secp256r1) 256
+ * P-384 (secp384r1) 384
+ * P-521 (secp521r1) 521
+ * secp571r1 571(⚠️ 最大支持 571)
+ */
RSA.builder().algorithm = "EC";
- RSA.builder().initKeys(1024);
+ Map stringStringMap = RSA.builder().initKeys(256);
+ Assertions.assertNotNull(stringStringMap);
+ Assertions.assertEquals(2, stringStringMap.size());
+ Assertions.assertEquals(124, stringStringMap.get("publicKey").length());
+ Assertions.assertEquals(92, stringStringMap.get("privateKey").length());
+
}
}
\ No newline at end of file
diff --git a/src/test/java/com/yexuejc/base/util/FileUtilTest.java b/src/test/java/com/yexuejc/base/util/FileUtilTest.java
index da8e212..7514b52 100644
--- a/src/test/java/com/yexuejc/base/util/FileUtilTest.java
+++ b/src/test/java/com/yexuejc/base/util/FileUtilTest.java
@@ -8,6 +8,7 @@ import java.util.stream.Collectors;
import com.yexuejc.base.pojo.ReadFileBean;
import com.yexuejc.base.util.bean.AppnodeCertCsvBean;
+import com.yexuejc.base.exception.BaseException;
/**
*
@@ -15,7 +16,7 @@ import com.yexuejc.base.util.bean.AppnodeCertCsvBean;
* @date: 2024/4/8 11:33
*/
public class FileUtilTest {
- public static void main(String[] args) throws IOException {
+ public static void main(String[] args) throws IOException, BaseException {
readCsvFile();
// other();
}
@@ -54,7 +55,7 @@ public class FileUtilTest {
}
- private static void readCsvFile() throws IOException {
+ private static void readCsvFile() throws IOException, BaseException {
String path = "F:\\coding\\yexuejc-base\\src\\test\\java\\com\\yexuejc\\base\\util\\test.csv";
// List list = FileUtil.readCsv(path, AppnodeCertCsvBean.class, true, "enable,domain,protocol,deployHost,deployPath,uname,pwd,appnodeId", ',');
diff --git a/src/test/java/com/yexuejc/base/util/JwtUtilTest.java b/src/test/java/com/yexuejc/base/util/JwtUtilTest.java
index beeb6b0..5833cb5 100644
--- a/src/test/java/com/yexuejc/base/util/JwtUtilTest.java
+++ b/src/test/java/com/yexuejc/base/util/JwtUtilTest.java
@@ -1,10 +1,12 @@
package com.yexuejc.base.util;
-import java.util.Map;
-
+import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
+import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
+import java.util.Map;
+
/**
* @author maxiaofeng
* @date 2024/9/1 15:23
@@ -20,7 +22,7 @@ class JwtUtilTest {
String jwtStr = jwtUtil.compact(map.get("payload"));
System.out.println(jwtStr);
- Map, ?> parse = jwtUtil.parse(jwtStr);
- System.out.println(JsonUtil.obj2Json(parse));
+ ExpiredJwtException expiredJwtException = Assertions.assertThrows(ExpiredJwtException.class, () -> jwtUtil.parse(jwtStr));
+ System.out.println(expiredJwtException.getMessage());
}
}
\ No newline at end of file
diff --git a/src/test/java/com/yexuejc/base/util/ObjUtilTest.java b/src/test/java/com/yexuejc/base/util/ObjUtilTest.java
index 350ccd8..fad16ea 100644
--- a/src/test/java/com/yexuejc/base/util/ObjUtilTest.java
+++ b/src/test/java/com/yexuejc/base/util/ObjUtilTest.java
@@ -1,11 +1,14 @@
package com.yexuejc.base.util;
import com.yexuejc.base.annotation.ToUeProperty;
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -18,11 +21,8 @@ import java.util.Map;
*/
class ObjUtilTest {
- public static void main(String[] args) {
- start();
- }
-
- public static void start(){
+ @Test
+ public void testGetUnderlineMap() {
B a = new B();
a.nameFirst = "张三";
a.ageInt = "5165458";
@@ -30,19 +30,64 @@ class ObjUtilTest {
a.setaM1("method1");
a.setbM1("b1Mthod1");
a.protectedStr = "protectedStr";
- a.amount=new BigDecimal("3");
+ a.amount = new BigDecimal("3");
a.time = LocalDateTime.now();
- a.dateTime=new Date();
+ a.dateTime = new Date();
C c = new C();
c.ageInt = "test";
a.c = c;
a.list = new ArrayList<>();
a.list.add(c);
+
Map underlineMap = ObjUtil.getUnderlineMap(a, false, false);
+
+ assertNotNull(underlineMap, "下划线映射不应为null");
+ assertFalse(underlineMap.isEmpty(), "下划线映射不应为空");
+
+ // 验证下划线命名转换
+ assertTrue(underlineMap.containsKey("name_first"), "应包含name_first字段");
+ assertTrue(underlineMap.containsKey("age_int"), "应包含age_int字段");
+
+ // 验证自定义注解生效
+ assertTrue(underlineMap.containsKey("p_str"), "应包含p_str字段(来自@ToUeProperty注解)");
+
System.out.println(JsonUtil.formatPrinter(underlineMap));
}
- static class A implements Serializable {
+ @Test
+ public void testDepthClone() {
+ B original = new B();
+ original.nameFirst = "张三";
+ original.ageInt = "123";
+ original.testAss = "test";
+ original.amount = new BigDecimal("100");
+
+ B cloned = ObjUtil.depthClone(original);
+
+ assertNotNull(cloned, "克隆对象不应为null");
+ assertNotSame(original, cloned, "克隆对象应该是不同的实例");
+ assertEquals(original.nameFirst, cloned.nameFirst, "克隆对象的属性应该相等");
+ assertEquals(original.ageInt, cloned.ageInt, "克隆对象的属性应该相等");
+ assertEquals(original.amount, cloned.amount, "克隆对象的BigDecimal属性应该相等");
+ }
+
+ @Test
+ public void testCopyObject() throws Exception {
+ A source = new A();
+ source.nameFirst = "张三";
+ source.ageInt = "25";
+ source.setaM1("test");
+
+ // 使用包含和排除字段的方式进行复制,确保包含继承的字段
+ List includeFields = Arrays.asList("nameFirst", "ageInt");
+ B target = ObjUtil.copy(source, B.class, includeFields, null);
+
+ assertNotNull(target, "复制对象不应为null");
+ assertEquals(source.nameFirst, target.nameFirst, "复制后属性应该相等");
+ assertEquals(source.ageInt, target.ageInt, "复制后属性应该相等");
+ }
+
+ public static class A implements Serializable {
private static final long serialVersionUID = -8462118058721865488L;
public String nameFirst;
public String ageInt;
@@ -60,7 +105,7 @@ class ObjUtilTest {
}
}
- static class B extends A {
+ public static class B extends A {
private static final long serialVersionUID = -8462118058721865488L;
public String testAss;
private String bM1;
@@ -86,7 +131,7 @@ class ObjUtilTest {
}
}
- static class C extends A {
+ public static class C extends A {
private static final long serialVersionUID = -8462118058721865488L;
public String testAss;
private String bM1;
@@ -100,57 +145,4 @@ class ObjUtilTest {
return this;
}
}
-
-// public static void main(String[] args) {
-//// test1();
-//// test2();
-//
-// }
-//
-// private static void test2() {
-// B t = new B();
-// t.sex = "男";
-// t.age = 18;
-// A test = new A();
-// test.name = "张三";
-// t.test = test;
-// B b = depthClone(t);
-// System.out.println(JsonUtil.obj2Json(b));
-// }
-//
-// static class A implements Serializable {
-// private static final long serialVersionUID = -8462118058721865488L;
-// public String name;
-// }
-//
-// static class B implements Serializable {
-// private static final long serialVersionUID = 3297717505428005316L;
-// public int age;
-// public String sex;
-// public A test;
-// }
-//
-// static class C implements Serializable {
-// private static final long serialVersionUID = 3297717505428005316L;
-// public int age;
-// public String sex;
-// public A test;
-// }
-//
-// private static void test1() {
-// ApiVO apiVO = new ApiVO(ApiVO.STATUS.S);
-// apiVO.setMsg("asdsadsad");
-// apiVO.setObject1("sadsadsad");
-//
-// Resps obj = new Resps<>();
-// obj.setSucc("安达圣斗士", "ok");
-// System.out.println(obj);
-// apiVO.setObject2(obj);
-// ApiVO apiVO1 = depthClone(apiVO);
-// System.out.println(apiVO == apiVO1);
-// System.out.println(JsonUtil.obj2Json(apiVO1));
-// System.out.println(JsonUtil.obj2Json(apiVO1.getObject1(String.class)));
-// System.out.println(JsonUtil.obj2Json(apiVO1.getObject2(Resps.class)));
-// System.out.println(apiVO1.getObject2(Resps.class) == obj);
-// }
}
\ No newline at end of file
diff --git a/src/test/java/com/yexuejc/base/util/StrUtilTest.java b/src/test/java/com/yexuejc/base/util/StrUtilTest.java
index 63c97ba..22cc13b 100644
--- a/src/test/java/com/yexuejc/base/util/StrUtilTest.java
+++ b/src/test/java/com/yexuejc/base/util/StrUtilTest.java
@@ -1,139 +1,213 @@
package com.yexuejc.base.util;
-import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.*;
+
class StrUtilTest {
@Test
void isEmpty() {
+ assertTrue(StrUtil.isEmpty(null));
+ assertTrue(StrUtil.isEmpty(""));
+ assertTrue(StrUtil.isEmpty(new ArrayList<>()));
+ assertFalse(StrUtil.isEmpty("test"));
}
@Test
void isNotEmpty() {
+ assertFalse(StrUtil.isNotEmpty(null));
+ assertFalse(StrUtil.isNotEmpty(""));
+ assertTrue(StrUtil.isNotEmpty("test"));
}
@Test
void genUUID() {
+ String uuid = StrUtil.genUUID();
+ assertNotNull(uuid);
+ assertEquals(32, uuid.length());
+ assertFalse(uuid.contains("-"));
}
@Test
void testGenUUID() {
+ String uuid10 = StrUtil.genUUID(10);
+ assertEquals(10, uuid10.length());
+
+ String uuid40 = StrUtil.genUUID(40);
+ assertEquals(40, uuid40.length());
}
@Test
void genNum() {
+ String num = StrUtil.genNum();
+ assertNotNull(num);
+ assertEquals(8, num.length());
+ assertTrue(num.matches("[01]\\d{7}"));
}
@Test
void toHex() {
+ byte[] bytes = "test".getBytes();
+ String hex = StrUtil.toHex(bytes);
+ assertNotNull(hex);
+ assertEquals("74657374", hex);
}
@Test
void toMD5() {
+ String md5 = StrUtil.toMD5("test");
+ assertNotNull(md5);
+ assertEquals(32, md5.length());
+ // test的MD5值
+ assertEquals("098f6bcd4621d373cade4e832627b4f6", md5);
}
@Test
void toSHA256() {
+ String sha256 = StrUtil.toSHA256("test");
+ assertNotNull(sha256);
+ assertEquals(64, sha256.length());
}
@Test
void toSHA() {
+ String sha1 = StrUtil.toSHA("test", "SHA-1");
+ assertNotNull(sha1);
+ assertEquals(40, sha1.length());
}
@Test
void iso2utf() {
+ String result = StrUtil.iso2utf("test");
+ assertNotNull(result);
}
@Test
void isNumeric() {
+ assertTrue(StrUtil.isNumeric("123"));
+ assertFalse(StrUtil.isNumeric("abc"));
+ assertFalse(StrUtil.isNumeric(null)); // 这应该返回false,因为null不是数字
}
@Test
void codeId() {
+ String encoded = StrUtil.codeId("12345678901234567890123456789012"); // 32位字符串
+ assertNotNull(encoded);
+ assertEquals(64, encoded.length()); // 编码后应该是64位
}
@Test
void decodeId() {
+ // 使用一个32位的ID进行编码然后解码测试
+ String originalId = "12345678901234567890123456789012";
+ String encoded = StrUtil.codeId(originalId);
+ String decoded = StrUtil.decodeId(encoded);
+ assertEquals(originalId, decoded);
}
@Test
void parseUrlencoded() {
+ Map result = StrUtil.parseUrlencoded("key1=value1&key2=value2");
+ assertNotNull(result);
+ assertEquals(2, result.size());
+ assertEquals("value1", result.get("key1"));
+ assertEquals("value2", result.get("key2"));
}
@Test
void getSignContent() {
+ Map params = new HashMap<>();
+ params.put("b", "2");
+ params.put("a", "1");
+ String result = StrUtil.getSignContent(params);
+ assertEquals("a=1&b=2", result);
}
@Test
void replaceMobile() {
+ String mobile = "13812345678";
+ String result = StrUtil.replaceMobile(mobile);
+ assertEquals("138****5678", result);
}
@Test
void mapSort() {
+ Map map = new HashMap<>();
+ map.put("c", 3);
+ map.put("a", 1);
+ map.put("b", 2);
+ Map sorted = StrUtil.mapSort(map);
+ assertNotNull(sorted);
+ // 验证排序后的顺序
+ List keys = new ArrayList<>(sorted.keySet());
+ assertEquals("a", keys.get(0));
+ assertEquals("b", keys.get(1));
+ assertEquals("c", keys.get(2));
}
@Test
void setStr() {
+ String result = StrUtil.setStr(null, "default");
+ assertEquals("default", result);
+
+ String result2 = StrUtil.setStr("test", "default");
+ assertEquals("test", result2);
}
@Test
void underlineToCamel() {
+ String result = StrUtil.underlineToCamel("user_name");
+ assertEquals("userName", result);
}
@Test
void camelToUnderline() {
+ String result = StrUtil.camelToUnderline("userName");
+ assertEquals("user_name", result);
}
@Test
void printStackTraceAndMessage() {
+ Exception e = new RuntimeException("test exception");
+ String result = StrUtil.printStackTraceAndMessage(e);
+ assertNotNull(result);
+ assertTrue(result.contains("test exception"));
}
@Test
void printStackTrace() {
+ Exception e = new RuntimeException("test");
+ String result = StrUtil.printStackTrace(e);
+ assertNotNull(result);
+ assertTrue(result.contains("RuntimeException"));
}
@Test
void notNullExecute() {
+ final boolean[] executed = {false};
+ StrUtil.notNullExecute("test", s -> executed[0] = true);
+ assertTrue(executed[0]);
+
+ executed[0] = false;
+ StrUtil.notNullExecute(null, s -> executed[0] = true);
+ assertFalse(executed[0]);
}
@Test
void notEmptyExecute() {
+ final boolean[] executed = {false};
+ StrUtil.notEmptyExecute("test", s -> executed[0] = true);
+ assertTrue(executed[0]);
+
+ executed[0] = false;
+ StrUtil.notEmptyExecute("", s -> executed[0] = true);
+ assertFalse(executed[0]);
}
- @Test
- void countryToCode() {
- Assertions.assertEquals(StrUtil.countryToCode("JPN"), "100000000");
- Assertions.assertEquals(StrUtil.countryToCode("KOR"), "010000000");
- Assertions.assertEquals(StrUtil.countryToCode("THA"), "001000000");
- Assertions.assertEquals(StrUtil.countryToCode("SGP"), "000100000");
- Assertions.assertEquals(StrUtil.countryToCode("CHN"), "000010000");
- Assertions.assertEquals(StrUtil.countryToCode("TWN"), "000001000");
- Assertions.assertEquals(StrUtil.countryToCode("HKG"), "000000100");
- Assertions.assertEquals(StrUtil.countryToCode("MAC"), "000000010");
- Assertions.assertEquals(StrUtil.countryToCode("999"), "000000001");
- Assertions.assertEquals(StrUtil.countryToCode("O"), "000000000");
-
- }
-
- @Test
- void getCountryByCode() {
- Assertions.assertEquals(StrUtil.getCountryByCode("100000000"), "JPN");
- Assertions.assertEquals(StrUtil.getCountryByCode("010000000"), "KOR");
- Assertions.assertEquals(StrUtil.getCountryByCode("001000000"), "THA");
- Assertions.assertEquals(StrUtil.getCountryByCode("000100000"), "SGP");
- Assertions.assertEquals(StrUtil.getCountryByCode("000010000"), "CHN");
- Assertions.assertEquals(StrUtil.getCountryByCode("000001000"), "TWN");
- Assertions.assertEquals(StrUtil.getCountryByCode("000000100"), "HKG");
- Assertions.assertEquals(StrUtil.getCountryByCode("000000010"), "MAC");
- Assertions.assertEquals(StrUtil.getCountryByCode("000000001"), "999");
- Assertions.assertEquals(StrUtil.getCountryByCode("000000000"), "O");
- Assertions.assertEquals(StrUtil.getCountryByCode("100000000000"), "O");
- Assertions.assertEquals(StrUtil.getCountryByCode("-100000000000"), "O");
- }
-
- @Test
- void countryToCodeByte() {
- System.out.println(String.format("%9s", Integer.toBinaryString(StrUtil.countryToCodeByte("CHN") & 0xFF)).replace(" ", "0"));
- }
}
\ No newline at end of file
diff --git a/src/test/java/com/yexuejc/base/util/SysUtilTest.java b/src/test/java/com/yexuejc/base/util/SysUtilTest.java
index f3cc470..ef8eaa3 100644
--- a/src/test/java/com/yexuejc/base/util/SysUtilTest.java
+++ b/src/test/java/com/yexuejc/base/util/SysUtilTest.java
@@ -1,22 +1,70 @@
package com.yexuejc.base.util;
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.*;
+
/**
- *
+ * SysUtil测试类
* @author: yexuejc
* @date: 2024/4/8 11:22
*/
public class SysUtilTest {
- public static void main(String[] args) {
- System.out.println(SysUtil.getCachePath());
- System.out.println(SysUtil.getRootPath(SysUtilTest.class, null));
- SysUtil.threadRun("test", () -> {
- String threadName = Thread.currentThread().getName();
- System.out.println("当前线程的名称是:" + threadName);
+
+ @Test
+ public void testGetCachePath() {
+ String cachePath = SysUtil.getCachePath();
+ assertNotNull(cachePath, "缓存路径不应为null");
+ assertFalse(cachePath.isEmpty(), "缓存路径不应为空");
+ System.out.println("Cache Path: " + cachePath);
+ }
+
+ @Test
+ public void testGetRootPath() {
+ var rootPath = SysUtil.getRootPath(SysUtilTest.class, null);
+ assertNotNull(rootPath, "根路径不应为null");
+ System.out.println("Root Path: " + rootPath);
+ }
+
+ @Test
+ public void testThreadRun() throws InterruptedException {
+ final String[] result = new String[1];
+
+ SysUtil.threadRun("test-thread", () -> {
+ result[0] = Thread.currentThread().getName();
+ System.out.println("当前线程的名称是:" + result[0]);
});
- SysUtil.getThreadList().forEach(t -> {
+
+ // 等待线程执行完毕
+ Thread.sleep(100);
+
+ assertNotNull(result[0], "线程应该已执行");
+ assertTrue(result[0].contains("test"), "线程名称应包含test");
+ }
+
+ @Test
+ public void testGetThreadList() {
+ var threadList = SysUtil.getThreadList();
+ assertNotNull(threadList, "线程列表不应为null");
+ assertFalse(threadList.isEmpty(), "线程列表不应为空");
+
+ threadList.forEach(t -> {
+ assertNotNull(t.getName(), "线程名称不应为null");
System.out.println("线程名称:" + t.getName());
});
- SysUtil.checkJvmMemory();
- System.out.println(SysUtil.jvmMemoryIsNotExecutable());
+ }
+
+ @Test
+ public void testCheckJvmMemory() {
+ // 这个方法主要是打印信息,我们验证它不会抛出异常
+ assertDoesNotThrow(() -> SysUtil.checkJvmMemory(), "检查JVM内存不应抛出异常");
+ }
+
+ @Test
+ public void testJvmMemoryIsNotExecutable() {
+ boolean result = SysUtil.jvmMemoryIsNotExecutable();
+ // 这是一个布尔值,我们只验证方法能正常执行
+ System.out.println("JVM Memory is not executable: " + result);
+ // 验证返回值类型
+ assertTrue(result == true || result == false, "应该返回布尔值");
}
}