From 2396b78c4f3eaf4901855e654b997db0092df0bd Mon Sep 17 00:00:00 2001 From: ZhouXY108 Date: Wed, 2 Apr 2025 10:23:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2=E8=84=B1=E6=95=8F=E6=96=B9=E6=B3=95=20StringTools#des?= =?UTF-8?q?ensitize?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plusone/commons/util/StringTools.java | 36 +++++++++ .../commons/util/StringToolsTests.java | 74 ++++++++++++++++++- 2 files changed, 109 insertions(+), 1 deletion(-) diff --git a/src/main/java/xyz/zhouxy/plusone/commons/util/StringTools.java b/src/main/java/xyz/zhouxy/plusone/commons/util/StringTools.java index 94ba9e2..821d219 100644 --- a/src/main/java/xyz/zhouxy/plusone/commons/util/StringTools.java +++ b/src/main/java/xyz/zhouxy/plusone/commons/util/StringTools.java @@ -184,6 +184,42 @@ public class StringTools { return true; } + /** + * 脱敏 + * + * @param src 原字符串 + * @param front 前面保留的字符数 + * @param end 后面保留的字符数 + * @return 脱敏结果 + * @since 1.1.0 + */ + public static String desensitize(@Nullable final String src, int front, int end) { + return desensitize(src, '*', front, end); + } + + /** + * 脱敏 + * + * @param src 原字符串 + * @param replacedChar 用于替换的字符 + * @param front 前面保留的字符数 + * @param end 后面保留的字符数 + * @return 脱敏结果 + * @since 1.1.0 + */ + public static String desensitize(@Nullable final String src, char replacedChar, int front, int end) { + if (src == null || src.isEmpty()) { + return EMPTY_STRING; + } + AssertTools.checkArgument(front >= 0 && end >= 0); + AssertTools.checkArgument((front + end) <= src.length(), "需要截取的长度不能大于原字符串长度"); + final char[] charArray = src.toCharArray(); + for (int i = front; i < charArray.length - end; i++) { + charArray[i] = replacedChar; + } + return String.valueOf(charArray); + } + private StringTools() { throw new IllegalStateException("Utility class"); } diff --git a/src/test/java/xyz/zhouxy/plusone/commons/util/StringToolsTests.java b/src/test/java/xyz/zhouxy/plusone/commons/util/StringToolsTests.java index 7bc2219..1d43950 100644 --- a/src/test/java/xyz/zhouxy/plusone/commons/util/StringToolsTests.java +++ b/src/test/java/xyz/zhouxy/plusone/commons/util/StringToolsTests.java @@ -26,6 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import java.lang.reflect.Constructor; import java.util.Arrays; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @SuppressWarnings("null") @@ -184,7 +185,7 @@ class StringToolsTests { // #region - isURL // ================================ - /** + /** * TC1: 验证标准HTTP协议URL */ @Test @@ -298,6 +299,77 @@ class StringToolsTests { // #endregion - repeat // ================================ + // ================================ + // #region - desensitize + // ================================ + + @Test + public void desensitize_NullInput_ReturnsEmptyString() { + String result = StringTools.desensitize(null, '#', 2, 2); + Assertions.assertEquals("", result); + } + + @Test + public void desensitize_EmptyString_ReturnsEmptyString() { + String result = StringTools.desensitize("", '#', 2, 2); + Assertions.assertEquals("", result); + } + + @Test + public void desensitize_NegativeFront_ThrowsException() { + Assertions.assertThrows(IllegalArgumentException.class, () -> { + StringTools.desensitize("123456", '#', -1, 2); + }); + } + + @Test + public void desensitize_NegativeEnd_ThrowsException() { + Assertions.assertThrows(IllegalArgumentException.class, () -> { + StringTools.desensitize("123456", '#', 2, -1); + }); + } + + @Test + public void desensitize_FrontPlusEndExceedsLength_ThrowsException() { + Assertions.assertThrows(IllegalArgumentException.class, () -> { + StringTools.desensitize("123456", '#', 3, 4); + }); + } + + @Test + public void desensitize_ValidInput_ReturnsDesensitizedString() { + String result = StringTools.desensitize("123456", '#', 2, 2); + Assertions.assertEquals("12##56", result); + } + + @Test + public void desensitize_FrontZero_ReturnsDesensitizedString() { + String result = StringTools.desensitize("123456", '#', 0, 2); + Assertions.assertEquals("####56", result); + } + + @Test + public void desensitize_EndZero_ReturnsDesensitizedString() { + String result = StringTools.desensitize("123456", '#', 2, 0); + Assertions.assertEquals("12####", result); + } + + @Test + public void desensitize_FrontAndEndZero_ReturnsDesensitizedString() { + String result = StringTools.desensitize("123456", '#', 0, 0); + Assertions.assertEquals("######", result); + } + + @Test + public void desensitize_ValidInput_DefaultReplacedChar_ReturnsDesensitizedString() { + String result = StringTools.desensitize("123456", 2, 2); + Assertions.assertEquals("12**56", result); + } + + // ================================ + // #endregion - desensitize + // ================================ + @Test void test_constructor_isNotAccessible_ThrowsIllegalStateException() { Constructor[] constructors = StringTools.class.getDeclaredConstructors();