Compare commits

...

3 Commits

Author SHA1 Message Date
f9b4c3c58c feat: 新增 StringTools#toQuotedString 方法 2025-05-18 15:18:52 +08:00
3ca2ec3be0 build: 简化依赖声明 2025-05-14 10:42:06 +08:00
f83bb55fd6 refactor!: 重构 DataOperationResultException (#56)
删除 `DataOperationResultException` 多余的构造方法,仅提供两个构造方法。
创建 `DataOperationResultException` 实例时,必须将预计影响的行数
和实际影响的行数作为入参。(不兼容)

重构 `AssertTools` 中相关的断言方法。

Reviewed-on: plusone/plusone-commons#56
Co-authored-by: ZhouXY108 <luquanlion@outlook.com>
Co-committed-by: ZhouXY108 <luquanlion@outlook.com>
2025-05-09 21:45:30 +08:00
6 changed files with 155 additions and 106 deletions

View File

@ -71,17 +71,7 @@
<dependency> <dependency>
<groupId>org.junit.jupiter</groupId> <groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId> <artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>

View File

@ -33,43 +33,49 @@ package xyz.zhouxy.plusone.commons.exception.system;
*/ */
public final class DataOperationResultException extends SysException { public final class DataOperationResultException extends SysException {
private static final String DEFAULT_MSG = "数据操作的结果不符合预期"; private final long expected;
private final long actual;
/** /**
* 使用默认 message 构造新的 {@code DataOperationResultException} * 创建一个 {@code DataOperationResultException} 对象
* {@code cause} 未初始化后面可能会通过调用 {@link #initCause} 进行初始化 *
* @param expected 预期影响的行数
* @param actual 实际影响的行数
*/ */
public DataOperationResultException() { public DataOperationResultException(long expected, long actual) {
super(DEFAULT_MSG); super(String.format("The number of rows affected is expected to be %d, but is: %d", expected, actual));
this.expected = expected;
this.actual = actual;
} }
/** /**
* 使用指定的 {@code message} 构造新的 {@code DataOperationResultException} * 创建一个 {@code DataOperationResultException} 对象
* {@code cause} 未初始化后面可能会通过调用 {@link #initCause} 进行初始化
* *
* @param message 异常信息 * @param expected 预期影响的行数
* @param actual 实际影响的行数
* @param message 错误信息
*/ */
public DataOperationResultException(String message) { public DataOperationResultException(long expected, long actual, String message) {
super(message); super(message);
this.expected = expected;
this.actual = actual;
} }
/** /**
* 使用指定的 {@code cause} 构造新的 {@code DataOperationResultException} * 预期影响的行数
* {@code message} (cause==null ? null : cause.toString())
* *
* @param cause 包装的异常 * @return the expected
*/ */
public DataOperationResultException(Throwable cause) { public long getExpected() {
super(cause); return expected;
} }
/** /**
* 使用指定的 {@code message} {@code cause} 构造新的 {@code DataOperationResultException} * 实际影响的行数
* *
* @param message 异常信息 * @return the actual
* @param cause 包装的异常
*/ */
public DataOperationResultException(String message, Throwable cause) { public long getActual() {
super(message, cause); return actual;
} }
} }

View File

@ -411,141 +411,154 @@ public class AssertTools {
/** /**
* 当影响的数据量与预计不同时抛出 {@link DataOperationResultException} * 当影响的数据量与预计不同时抛出 {@link DataOperationResultException}
* *
* @param expectedValue 预计的数量 * @param expected 预期影响的行数
* @param result 实际影响的数据量 * @param actualRowCount 实际影响的行数
*/ */
public static void checkAffectedRows(int expectedValue, int result) { public static void checkAffectedRows(int expected, int actualRowCount) {
checkAffectedRows(expectedValue, result, if (expected != actualRowCount) {
"The number of rows affected is expected to be %d, but is: %d", expectedValue, result); throw new DataOperationResultException(expected, actualRowCount);
}
} }
/** /**
* 当影响的数据量与预计不同时抛出 {@link DataOperationResultException} * 当影响的数据量与预计不同时抛出 {@link DataOperationResultException}
* *
* @param expectedValue 预计的数量 * @param expected 预期影响的行数
* @param result 实际影响的数据量 * @param actualRowCount 实际影响的行数
* @param errorMessage 异常信息 * @param errorMessage 异常信息
*/ */
public static void checkAffectedRows(int expectedValue, int result, @Nullable String errorMessage) { public static void checkAffectedRows(int expected, int actualRowCount,
checkCondition(expectedValue == result, () -> new DataOperationResultException(errorMessage)); @Nullable String errorMessage) {
if (expected != actualRowCount) {
throw new DataOperationResultException(expected, actualRowCount, errorMessage);
}
} }
/** /**
* 当影响的数据量与预计不同时抛出 {@link DataOperationResultException} * 当影响的数据量与预计不同时抛出 {@link DataOperationResultException}
* *
* @param expectedValue 预计的数量 * @param expected 预期影响的行数
* @param result 实际影响的数据量 * @param actualRowCount 实际影响的行数
* @param errorMessageSupplier 异常信息 * @param errorMessageSupplier 异常信息
*/ */
public static void checkAffectedRows(int expectedValue, int result, public static void checkAffectedRows(int expected, int actualRowCount,
Supplier<String> errorMessageSupplier) { Supplier<String> errorMessageSupplier) {
checkCondition(expectedValue == result, if (expected != actualRowCount) {
() -> new DataOperationResultException(errorMessageSupplier.get())); throw new DataOperationResultException(expected, actualRowCount, errorMessageSupplier.get());
}
} }
/** /**
* 当影响的数据量与预计不同时抛出 {@link DataOperationResultException} * 当影响的数据量与预计不同时抛出 {@link DataOperationResultException}
* *
* @param expectedValue 预计的数量 * @param expected 预期影响的行数
* @param result 实际影响的数据量 * @param actualRowCount 实际影响的行数
* @param errorMessageTemplate 异常信息模板 * @param errorMessageTemplate 异常信息模板
* @param errorMessageArgs 异常信息参数 * @param errorMessageArgs 异常信息参数
*/ */
public static void checkAffectedRows(int expectedValue, int result, public static void checkAffectedRows(int expected, int actualRowCount,
String errorMessageTemplate, Object... errorMessageArgs) { String errorMessageTemplate, Object... errorMessageArgs) {
checkCondition(expectedValue == result, if (expected != actualRowCount) {
() -> new DataOperationResultException(String.format(errorMessageTemplate, errorMessageArgs))); throw new DataOperationResultException(expected, actualRowCount,
String.format(errorMessageTemplate, errorMessageArgs));
}
} }
/** /**
* 当影响的数据量与预计不同时抛出 {@link DataOperationResultException} * 当影响的数据量与预计不同时抛出 {@link DataOperationResultException}
* *
* @param expectedValue 预计的数量 * @param expected 预期影响的行数
* @param result 实际影响的数据量 * @param actualRowCount 实际影响的行数
*/ */
public static void checkAffectedRows(long expectedValue, long result) { public static void checkAffectedRows(long expected, long actualRowCount) {
checkAffectedRows(expectedValue, result, if (expected != actualRowCount) {
"The number of rows affected is expected to be %d, but is: %d", expectedValue, result); throw new DataOperationResultException(expected, actualRowCount);
}
} }
/** /**
* 当影响的数据量与预计不同时抛出 {@link DataOperationResultException} * 当影响的数据量与预计不同时抛出 {@link DataOperationResultException}
* *
* @param expectedValue 预计的数量 * @param expected 预期影响的行数
* @param result 实际影响的数据量 * @param actualRowCount 实际影响的行数
* @param errorMessage 异常信息 * @param errorMessage 异常信息
*/ */
public static void checkAffectedRows(long expectedValue, long result, @Nullable String errorMessage) { public static void checkAffectedRows(long expected, long actualRowCount,
checkCondition(expectedValue == result, () -> new DataOperationResultException(errorMessage)); @Nullable String errorMessage) {
if (expected != actualRowCount) {
throw new DataOperationResultException(expected, actualRowCount, errorMessage);
}
} }
/** /**
* 当影响的数据量与预计不同时抛出 {@link DataOperationResultException} * 当影响的数据量与预计不同时抛出 {@link DataOperationResultException}
* *
* @param expectedValue 预计的数量 * @param expected 预期影响的行数
* @param result 实际影响的数据量 * @param actualRowCount 实际影响的行数
* @param errorMessageSupplier 异常信息 * @param errorMessageSupplier 异常信息
*/ */
public static void checkAffectedRows(long expectedValue, long result, public static void checkAffectedRows(long expected, long actualRowCount,
Supplier<String> errorMessageSupplier) { Supplier<String> errorMessageSupplier) {
checkCondition(expectedValue == result, if (expected != actualRowCount) {
() -> new DataOperationResultException(errorMessageSupplier.get())); throw new DataOperationResultException(expected, actualRowCount, errorMessageSupplier.get());
}
} }
/** /**
* 当影响的数据量与预计不同时抛出 {@link DataOperationResultException} * 当影响的数据量与预计不同时抛出 {@link DataOperationResultException}
* *
* @param expectedValue 预计的数量 * @param expected 预期影响的行数
* @param result 实际影响的数据量 * @param actualRowCount 实际影响的行数
* @param errorMessageTemplate 异常信息模板 * @param errorMessageTemplate 异常信息模板
* @param errorMessageArgs 异常信息参数 * @param errorMessageArgs 异常信息参数
*/ */
public static void checkAffectedRows(long expectedValue, long result, public static void checkAffectedRows(long expected, long actualRowCount,
String errorMessageTemplate, Object... errorMessageArgs) { String errorMessageTemplate, Object... errorMessageArgs) {
checkCondition(expectedValue == result, if (expected != actualRowCount) {
() -> new DataOperationResultException(String.format(errorMessageTemplate, errorMessageArgs))); throw new DataOperationResultException(expected, actualRowCount,
String.format(errorMessageTemplate, errorMessageArgs));
}
} }
/** /**
* 当影响的数据量不为 1 时抛出 {@link DataOperationResultException} * 当影响的数据量不为 1 时抛出 {@link DataOperationResultException}
* *
* @param result 实际影响的数据量 * @param actualRowCount 实际影响的行数
*/ */
public static void checkAffectedOneRow(int result) { public static void checkAffectedOneRow(int actualRowCount) {
checkAffectedRows(1, result, checkAffectedRows(1, actualRowCount);
() -> "The number of rows affected is expected to be 1, but is: " + result);
} }
/** /**
* 当影响的数据量不为 1 时抛出 {@link DataOperationResultException} * 当影响的数据量不为 1 时抛出 {@link DataOperationResultException}
* *
* @param result 实际影响的数据量 * @param actualRowCount 实际影响的行数
* @param errorMessage 异常信息 * @param errorMessage 异常信息
*/ */
public static void checkAffectedOneRow(int result, String errorMessage) { public static void checkAffectedOneRow(int actualRowCount, String errorMessage) {
checkAffectedRows(1, result, errorMessage); checkAffectedRows(1, actualRowCount, errorMessage);
} }
/** /**
* 当影响的数据量不为 1 时抛出 {@link DataOperationResultException} * 当影响的数据量不为 1 时抛出 {@link DataOperationResultException}
* *
* @param result 实际影响的数据量 * @param actualRowCount 实际影响的行数
* @param errorMessageSupplier 异常信息 * @param errorMessageSupplier 异常信息
*/ */
public static void checkAffectedOneRow(int result, Supplier<String> errorMessageSupplier) { public static void checkAffectedOneRow(int actualRowCount, Supplier<String> errorMessageSupplier) {
checkAffectedRows(1, result, errorMessageSupplier); checkAffectedRows(1, actualRowCount, errorMessageSupplier);
} }
/** /**
* 当影响的数据量不为 1 时抛出 {@link DataOperationResultException} * 当影响的数据量不为 1 时抛出 {@link DataOperationResultException}
* *
* @param result 实际影响的数据量 * @param actualRowCount 实际影响的行数
* @param errorMessageTemplate 异常信息模板 * @param errorMessageTemplate 异常信息模板
* @param errorMessageArgs 异常信息参数 * @param errorMessageArgs 异常信息参数
*/ */
public static void checkAffectedOneRow(int result, public static void checkAffectedOneRow(int actualRowCount,
String errorMessageTemplate, Object... errorMessageArgs) { String errorMessageTemplate, Object... errorMessageArgs) {
checkAffectedRows(1, result, errorMessageTemplate, errorMessageArgs); checkAffectedRows(1, actualRowCount, errorMessageTemplate, errorMessageArgs);
} }
/** /**
@ -554,40 +567,39 @@ public class AssertTools {
* @param result 实际影响的数据量 * @param result 实际影响的数据量
*/ */
public static void checkAffectedOneRow(long result) { public static void checkAffectedOneRow(long result) {
checkAffectedRows(1L, result, checkAffectedRows(1L, result);
() -> "The number of rows affected is expected to be 1, but is: " + result);
} }
/** /**
* 当影响的数据量不为 1 时抛出 {@link DataOperationResultException} * 当影响的数据量不为 1 时抛出 {@link DataOperationResultException}
* *
* @param result 实际影响的数据量 * @param actualRowCount 实际影响的行数
* @param errorMessage 异常信息 * @param errorMessage 异常信息
*/ */
public static void checkAffectedOneRow(long result, String errorMessage) { public static void checkAffectedOneRow(long actualRowCount, String errorMessage) {
checkAffectedRows(1L, result, errorMessage); checkAffectedRows(1L, actualRowCount, errorMessage);
} }
/** /**
* 当影响的数据量不为 1 时抛出 {@link DataOperationResultException} * 当影响的数据量不为 1 时抛出 {@link DataOperationResultException}
* *
* @param result 实际影响的数据量 * @param actualRowCount 实际影响的行数
* @param errorMessageSupplier 异常信息 * @param errorMessageSupplier 异常信息
*/ */
public static void checkAffectedOneRow(long result, Supplier<String> errorMessageSupplier) { public static void checkAffectedOneRow(long actualRowCount, Supplier<String> errorMessageSupplier) {
checkAffectedRows(1L, result, errorMessageSupplier); checkAffectedRows(1L, actualRowCount, errorMessageSupplier);
} }
/** /**
* 当影响的数据量不为 1 时抛出 {@link DataOperationResultException} * 当影响的数据量不为 1 时抛出 {@link DataOperationResultException}
* *
* @param result 实际影响的数据量 * @param actualRowCount 实际影响的行数
* @param errorMessageTemplate 异常信息模板 * @param errorMessageTemplate 异常信息模板
* @param errorMessageArgs 异常信息参数 * @param errorMessageArgs 异常信息参数
*/ */
public static void checkAffectedOneRow(long result, public static void checkAffectedOneRow(long actualRowCount,
String errorMessageTemplate, Object... errorMessageArgs) { String errorMessageTemplate, Object... errorMessageArgs) {
checkAffectedRows(1L, result, errorMessageTemplate, errorMessageArgs); checkAffectedRows(1L, actualRowCount, errorMessageTemplate, errorMessageArgs);
} }
// ================================ // ================================

View File

@ -220,6 +220,23 @@ public class StringTools {
return String.valueOf(charArray); return String.valueOf(charArray);
} }
/**
* 转换为带引号的字符串
*
* @param value
* @return 带引号的字符串
* @since 1.1.0
*/
public static String toQuotedString(@Nullable String value) {
if (value == null) {
return "null";
}
if (value.isEmpty()) {
return "\"\"";
}
return "\"" + value + "\"";
}
private StringTools() { private StringTools() {
throw new IllegalStateException("Utility class"); throw new IllegalStateException("Utility class");
} }

View File

@ -370,6 +370,38 @@ class StringToolsTests {
// #endregion - desensitize // #endregion - desensitize
// ================================ // ================================
// ================================
// #region - toQuotedString
// ================================
@Test
void toQuotedString_NullInput_ReturnsNullStr() {
String result = StringTools.toQuotedString(null);
assertEquals("null", result);
assertEquals("The value is null.", String.format("The value is %s.", result));
}
@Test
void toQuotedString_EmptyString_ReturnsEmptyString() {
String result = StringTools.toQuotedString("");
assertEquals("\"\"", result);
assertEquals("The value is \"\".", String.format("The value is %s.", result));
}
@Test
void toQuotedString_ValidInput_ReturnsQuotedString() {
String result = StringTools.toQuotedString("Hello World");
assertEquals("\"Hello World\"", result);
assertEquals("The value is \"Hello World\".", String.format("The value is %s.", result));
}
// ================================
// #endregion - toQuotedString
// ================================
@Test @Test
void test_constructor_isNotAccessible_ThrowsIllegalStateException() { void test_constructor_isNotAccessible_ThrowsIllegalStateException() {
Constructor<?>[] constructors = StringTools.class.getDeclaredConstructors(); Constructor<?>[] constructors = StringTools.class.getDeclaredConstructors();

View File

@ -209,19 +209,11 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.junit.jupiter</groupId> <groupId>org.junit</groupId>
<artifactId>junit-jupiter-api</artifactId> <artifactId>junit-bom</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit.version}</version> <version>${junit.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency> </dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>