diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/util/RandomUtil.java b/hutool-core/src/main/java/cn/hutool/v7/core/util/RandomUtil.java index 3aca2dde56..7673855135 100644 --- a/hutool-core/src/main/java/cn/hutool/v7/core/util/RandomUtil.java +++ b/hutool-core/src/main/java/cn/hutool/v7/core/util/RandomUtil.java @@ -426,18 +426,17 @@ public class RandomUtil { } /** - * 获得指定范围内的随机数 + * 获得指定范围内的随机数
+ * 保留小数使用{@link RoundingMode#DOWN}是因为始终要保证随机数在指定范围内 * - * @param minInclude 最小数(包含) - * @param maxExclude 最大数(不包含) - * @param scale 保留小数位数 - * @param roundingMode 保留小数的模式 {@link RoundingMode} + * @param minInclude 最小数(包含) + * @param maxExclude 最大数(不包含) + * @param scale 保留小数位数,使用{@link RoundingMode#DOWN} * @return 随机数 * @since 4.0.8 */ - public static double randomDouble(final double minInclude, final double maxExclude, final int scale, - final RoundingMode roundingMode) { - return NumberUtil.round(randomDouble(minInclude, maxExclude), scale, roundingMode).doubleValue(); + public static double randomDouble(final double minInclude, final double maxExclude, final int scale) { + return NumberUtil.round(randomDouble(minInclude, maxExclude), scale, RoundingMode.DOWN).doubleValue(); } /** @@ -452,15 +451,15 @@ public class RandomUtil { } /** - * 获得指定范围内的随机数 + * 获得指定范围内的随机数
+ * 保留小数使用{@link RoundingMode#DOWN}是因为始终要保证随机数在指定范围内 * - * @param scale 保留小数位数 - * @param roundingMode 保留小数的模式 {@link RoundingMode} + * @param scale 保留小数位数,使用{@link RoundingMode#DOWN} * @return 随机数 * @since 4.0.8 */ - public static double randomDouble(final int scale, final RoundingMode roundingMode) { - return NumberUtil.round(randomDouble(), scale, roundingMode).doubleValue(); + public static double randomDouble(final int scale) { + return NumberUtil.round(randomDouble(), scale, RoundingMode.DOWN).doubleValue(); } /** @@ -476,16 +475,16 @@ public class RandomUtil { } /** - * 获得指定范围内的随机数 + * 获得指定范围内的随机数
+ * 保留小数使用{@link RoundingMode#DOWN}是因为始终要保证随机数在指定范围内 * - * @param limit 限制随机数的范围,不包括这个数 - * @param scale 保留小数位数 - * @param roundingMode 保留小数的模式 {@link RoundingMode} + * @param limit 限制随机数的范围,不包括这个数 + * @param scale 保留小数位数,使用{@link RoundingMode#DOWN} * @return 随机数 * @since 4.0.8 */ - public static double randomDouble(final double limit, final int scale, final RoundingMode roundingMode) { - return NumberUtil.round(randomDouble(limit), scale, roundingMode).doubleValue(); + public static double randomDouble(final double limit, final int scale) { + return NumberUtil.round(randomDouble(limit), scale, RoundingMode.DOWN).doubleValue(); } // endregion @@ -712,7 +711,7 @@ public class RandomUtil { */ public static String randomLettersAndNumbersWithoutStr(final int length, final String elemData) { char[] baseChars = LETTERS_NUMBERS_CHARS; - if(StrUtil.isNotBlank(elemData)){ + if (StrUtil.isNotBlank(elemData)) { baseChars = ArrayUtil.removeElements(baseChars, elemData.toCharArray()); } return randomString(baseChars, length); @@ -728,7 +727,7 @@ public class RandomUtil { */ public static String randomLettersAndNumbersLowerWithoutStr(final int length, final String elemData) { char[] baseChars = LETTERS_NUMBERS_LOWER_CHARS; - if(StrUtil.isNotBlank(elemData)){ + if (StrUtil.isNotBlank(elemData)) { baseChars = ArrayUtil.removeElements(baseChars, elemData.toLowerCase().toCharArray()); } return randomString(baseChars, length); @@ -846,11 +845,11 @@ public class RandomUtil { * 获得一个随机的字符串 * * @param baseChars 随机字符选取的样本 - * @param length 字符串的长度 + * @param length 字符串的长度 * @return 随机字符串 */ public static char[] randomChars(final char[] baseChars, final int length) { - if(ArrayUtil.isEmpty(baseChars)){ + if (ArrayUtil.isEmpty(baseChars)) { throw new IllegalArgumentException("baseChars can not be empty !"); } Assert.isTrue(length >= 1, "Length can not less than 1 !"); diff --git a/hutool-core/src/test/java/cn/hutool/v7/core/reflect/method/MethodUtilTest.java b/hutool-core/src/test/java/cn/hutool/v7/core/reflect/method/MethodUtilTest.java index 6ababff047..2c15955e17 100644 --- a/hutool-core/src/test/java/cn/hutool/v7/core/reflect/method/MethodUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/v7/core/reflect/method/MethodUtilTest.java @@ -16,7 +16,6 @@ package cn.hutool.v7.core.reflect.method; -import lombok.Data; import cn.hutool.v7.core.array.ArrayUtil; import cn.hutool.v7.core.date.StopWatch; import cn.hutool.v7.core.lang.Console; @@ -24,89 +23,79 @@ import cn.hutool.v7.core.lang.test.bean.ExamInfoDict; import cn.hutool.v7.core.reflect.ClassUtil; import cn.hutool.v7.core.reflect.ReflectTestBeans; import cn.hutool.v7.core.text.StrUtil; -import cn.hutool.v7.core.util.JdkUtil; -import org.junit.jupiter.api.Assertions; +import lombok.Data; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import java.lang.reflect.Method; -public class MethodUtilTest extends ReflectTestBeans { +import static org.junit.jupiter.api.Assertions.*; - private static final boolean isGteJdk15 = getJavaVersion() >= 15; - /** - * jdk版本:是否>= jdk15 - * jdk15: 删除了 object registerNatives - * @return 反馈jdk版本,如:7、8、11、15、17 - * @author dazer - */ - private static int getJavaVersion() { - return JdkUtil.JVM_VERSION; - } +public class MethodUtilTest extends ReflectTestBeans { @Test public void getMethodsTest() { Method[] methods = MethodUtil.getMethods(ExamInfoDict.class); - Assertions.assertEquals(isGteJdk15 ? 19 : 20, methods.length); + assertTrue(methods.length >= 19 && methods.length <= 20); //过滤器测试 methods = MethodUtil.getMethods(ExamInfoDict.class, t -> Integer.class.equals(t.getReturnType())); - Assertions.assertEquals(4, methods.length); + assertEquals(4, methods.length); final Method method = methods[0]; - Assertions.assertNotNull(method); + assertNotNull(method); //null过滤器测试 methods = MethodUtil.getMethods(ExamInfoDict.class, null); - Assertions.assertEquals(isGteJdk15 ? 19 : 20, methods.length); + assertTrue(methods.length >= 19 && methods.length <= 20); final Method method2 = methods[0]; - Assertions.assertNotNull(method2); + assertNotNull(method2); } @Test public void getMethodTest() { Method method = MethodUtil.getMethod(ExamInfoDict.class, "getId"); - Assertions.assertEquals("getId", method.getName()); - Assertions.assertEquals(0, method.getParameterTypes().length); + assertEquals("getId", method.getName()); + assertEquals(0, method.getParameterTypes().length); method = MethodUtil.getMethod(ExamInfoDict.class, "getId", Integer.class); - Assertions.assertEquals("getId", method.getName()); - Assertions.assertEquals(1, method.getParameterTypes().length); + assertEquals("getId", method.getName()); + assertEquals(1, method.getParameterTypes().length); } @Test public void getMethodIgnoreCaseTest() { Method method = MethodUtil.getMethodIgnoreCase(ExamInfoDict.class, "getId"); - Assertions.assertEquals("getId", method.getName()); - Assertions.assertEquals(0, method.getParameterTypes().length); + assertEquals("getId", method.getName()); + assertEquals(0, method.getParameterTypes().length); method = MethodUtil.getMethodIgnoreCase(ExamInfoDict.class, "GetId"); - Assertions.assertEquals("getId", method.getName()); - Assertions.assertEquals(0, method.getParameterTypes().length); + assertEquals("getId", method.getName()); + assertEquals(0, method.getParameterTypes().length); method = MethodUtil.getMethodIgnoreCase(ExamInfoDict.class, "setanswerIs", Integer.class); - Assertions.assertEquals("setAnswerIs", method.getName()); - Assertions.assertEquals(1, method.getParameterTypes().length); + assertEquals("setAnswerIs", method.getName()); + assertEquals(1, method.getParameterTypes().length); } @Test public void invokeTest() { final AClass testClass = new AClass(); MethodUtil.invoke(testClass, "setA", 10); - Assertions.assertEquals(10, testClass.getA()); + assertEquals(10, testClass.getA()); } @Test public void getDeclaredMethodsTest() { Class type = TestBenchClass.class; Method[] methods = type.getDeclaredMethods(); - Assertions.assertArrayEquals(methods, MethodUtil.getDeclaredMethods(type)); - Assertions.assertSame(MethodUtil.getDeclaredMethods(type), MethodUtil.getDeclaredMethods(type)); + assertArrayEquals(methods, MethodUtil.getDeclaredMethods(type)); + assertSame(MethodUtil.getDeclaredMethods(type), MethodUtil.getDeclaredMethods(type)); type = Object.class; methods = type.getDeclaredMethods(); - Assertions.assertArrayEquals(methods, MethodUtil.getDeclaredMethods(type)); + assertArrayEquals(methods, MethodUtil.getDeclaredMethods(type)); } @Test @@ -156,19 +145,26 @@ public class MethodUtilTest extends ReflectTestBeans { public void getMethodsFromClassExtends() { // 继承情况下,需解决方法去重问题 Method[] methods = MethodUtil.getMethods(C2.class); - Assertions.assertEquals(isGteJdk15 ? 14 : 15, methods.length); + // 在使用jacoco时,会多出jacocoInit方法,在此兼容 + assertTrue(methods.length >= 14 && methods.length <= 15); // 排除Object中的方法 // 3个方法包括类 methods = MethodUtil.getMethodsDirectly(C2.class, true, false); - Assertions.assertEquals(3, methods.length); + assertTrue(methods.length >= 3 && methods.length <= 4); + + int index = 0; + if(methods[index].toString().contains("jacocoInit")){ + // 引入jacoco后,会出jacocoInit方法,忽略之 + index++; + } // getA属于本类 - Assertions.assertEquals("public void cn.hutool.v7.core.reflect.ReflectTestBeans$C2.getA()", methods[0].toString()); + assertEquals("public void cn.hutool.v7.core.reflect.ReflectTestBeans$C2.getA()", methods[index].toString()); // getB属于父类 - Assertions.assertEquals("public void cn.hutool.v7.core.reflect.ReflectTestBeans$C1.getB()", methods[1].toString()); + assertEquals("public void cn.hutool.v7.core.reflect.ReflectTestBeans$C1.getB()", methods[index + 1].toString()); // getC属于接口中的默认方法 - Assertions.assertEquals("public default void cn.hutool.v7.core.reflect.ReflectTestBeans$TestInterface1.getC()", methods[2].toString()); + assertEquals("public default void cn.hutool.v7.core.reflect.ReflectTestBeans$TestInterface1.getC()", methods[index + 2].toString()); } @Test @@ -176,47 +172,47 @@ public class MethodUtilTest extends ReflectTestBeans { // 对于接口,直接调用Class.getMethods方法获取所有方法,因为接口都是public方法 // 因此此处得到包括TestInterface1、TestInterface2、TestInterface3中一共4个方法 final Method[] methods = MethodUtil.getMethods(TestInterface3.class); - Assertions.assertEquals(4, methods.length); + assertEquals(4, methods.length); // 接口里,调用getMethods和getPublicMethods效果相同 final Method[] publicMethods = MethodUtil.getPublicMethods(TestInterface3.class); - Assertions.assertArrayEquals(methods, publicMethods); + assertArrayEquals(methods, publicMethods); } @Test public void getPublicMethod() { final Method superPublicMethod = MethodUtil.getPublicMethod(TestSubClass.class, false, "publicMethod"); - Assertions.assertNotNull(superPublicMethod); + assertNotNull(superPublicMethod); final Method superPrivateMethod = MethodUtil.getPublicMethod(TestSubClass.class, false, "privateMethod"); - Assertions.assertNull(superPrivateMethod); + assertNull(superPrivateMethod); final Method publicMethod = MethodUtil.getPublicMethod(TestSubClass.class, false, "publicSubMethod"); - Assertions.assertNotNull(publicMethod); + assertNotNull(publicMethod); final Method privateMethod = MethodUtil.getPublicMethod(TestSubClass.class, false, "privateSubMethod"); - Assertions.assertNull(privateMethod); + assertNull(privateMethod); } @Test public void getDeclaredMethod() { final Method noMethod = MethodUtil.getMethod(TestSubClass.class, "noMethod"); - Assertions.assertNull(noMethod); + assertNull(noMethod); final Method privateMethod = MethodUtil.getMethod(TestSubClass.class, "privateMethod"); - Assertions.assertNotNull(privateMethod); + assertNotNull(privateMethod); final Method publicMethod = MethodUtil.getMethod(TestSubClass.class, "publicMethod"); - Assertions.assertNotNull(publicMethod); + assertNotNull(publicMethod); final Method publicSubMethod = MethodUtil.getMethod(TestSubClass.class, "publicSubMethod"); - Assertions.assertNotNull(publicSubMethod); + assertNotNull(publicSubMethod); final Method privateSubMethod = MethodUtil.getMethod(TestSubClass.class, "privateSubMethod"); - Assertions.assertNotNull(privateSubMethod); + assertNotNull(privateSubMethod); } @Test public void issue2625Test(){ // 内部类继承的情况下父类方法会被定义为桥接方法,因此按照pr#1965@Github判断返回值的继承关系来代替判断桥接。 final Method getThis = MethodUtil.getMethod(A.C.class, "getThis"); - Assertions.assertTrue(getThis.isBridge()); + assertTrue(getThis.isBridge()); } @SuppressWarnings("InnerClassMayBeStatic") @@ -243,7 +239,7 @@ public class MethodUtilTest extends ReflectTestBeans { final TestClass testClass = new TestClass(); final Method method = MethodUtil.getMethod(TestClass.class, "setA", int.class); MethodUtil.invoke(testClass, method, 10); - Assertions.assertEquals(10, testClass.getA()); + assertEquals(10, testClass.getA()); } @Test @@ -251,14 +247,14 @@ public class MethodUtilTest extends ReflectTestBeans { final TestClass testClass = new TestClass(); final Method method = MethodUtil.getMethod(TestClass.class, "setA", int.class); MethodUtil.invoke(testClass, method, "10"); - Assertions.assertEquals(10, testClass.getA()); + assertEquals(10, testClass.getA()); } @Test public void invokeMethodWithParamConvertFailedTest() { final TestClass testClass = new TestClass(); final Method method = MethodUtil.getMethod(TestClass.class, "setA", int.class); - Assertions.assertThrows(IllegalArgumentException.class, + assertThrows(IllegalArgumentException.class, () -> MethodUtil.invoke(testClass, method, "aaa")); } } diff --git a/hutool-core/src/test/java/cn/hutool/v7/core/util/RandomUtilTest.java b/hutool-core/src/test/java/cn/hutool/v7/core/util/RandomUtilTest.java index 1683ba9832..04068e0673 100644 --- a/hutool-core/src/test/java/cn/hutool/v7/core/util/RandomUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/v7/core/util/RandomUtilTest.java @@ -23,7 +23,6 @@ import cn.hutool.v7.core.math.NumberUtil; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import java.math.RoundingMode; import java.util.List; import java.util.Locale; import java.util.Set; @@ -46,7 +45,7 @@ public class RandomUtilTest { @Test public void randomDoubleTest() { - final double randomDouble = RandomUtil.randomDouble(0, 1, 0, RoundingMode.HALF_UP); + final double randomDouble = RandomUtil.randomDouble(0, 1, 0); assertTrue(randomDouble <= 1); } @@ -136,7 +135,7 @@ public class RandomUtilTest { @Test public void testRandomDoubleWithScaleAndRoundingMode() { // 测试基本功能:生成0到10之间的随机数,保留2位小数,四舍五入 - final double result = RandomUtil.randomDouble(10.0, 2, RoundingMode.HALF_UP); + final double result = RandomUtil.randomDouble(10.0, 2); // 验证结果在[0, 10)范围内 assertTrue(result >= 0.0 && result < 10.0, @@ -159,17 +158,17 @@ public class RandomUtilTest { final double limit = 5.0; // 测试向上舍入 - final double upResult = RandomUtil.randomDouble(limit, 2, RoundingMode.UP); + final double upResult = RandomUtil.randomDouble(limit, 2); assertTrue(upResult >= 0.0 && upResult < limit, "UP模式下随机数应该在[0, 5)范围内"); // 测试向下舍入 - final double downResult = RandomUtil.randomDouble(limit, 2, RoundingMode.DOWN); + final double downResult = RandomUtil.randomDouble(limit, 2); assertTrue(downResult >= 0.0 && downResult < limit, "DOWN模式下随机数应该在[0, 5)范围内"); // 测试四舍五入 - final double halfUpResult = RandomUtil.randomDouble(limit, 2, RoundingMode.HALF_UP); + final double halfUpResult = RandomUtil.randomDouble(limit, 2); assertTrue(halfUpResult >= 0.0 && halfUpResult < limit, "HALF_UP模式下随机数应该在[0, 5)范围内"); } @@ -179,7 +178,7 @@ public class RandomUtilTest { */ @Test public void testRandomDoubleWithZeroScale() { - final double result = RandomUtil.randomDouble(10.0, 0, RoundingMode.HALF_UP); + final double result = RandomUtil.randomDouble(10.0, 0); // 验证结果在[0, 10)范围内 assertTrue(result >= 0.0 && result < 10.0, @@ -195,7 +194,7 @@ public class RandomUtilTest { */ @Test public void testRandomDoubleWithNullRoundingMode() { - final double result = RandomUtil.randomDouble(10.0, 2, null); + final double result = RandomUtil.randomDouble(10.0, 2); // 验证结果在[0, 10)范围内 assertTrue(result >= 0.0 && result < 10.0, @@ -215,7 +214,7 @@ public class RandomUtilTest { */ @Test public void testRandomDoubleWithSmallLimit() { - final double result = RandomUtil.randomDouble(0.001, 5, RoundingMode.HALF_UP); + final double result = RandomUtil.randomDouble(0.001, 5); // 验证结果在[0, 0.001)范围内 assertTrue(result >= 0.0 && result < 0.001, @@ -227,7 +226,7 @@ public class RandomUtilTest { */ @Test public void testRandomDoubleWithHighPrecision() { - final double result = RandomUtil.randomDouble(100.0, 10, RoundingMode.HALF_UP); + final double result = RandomUtil.randomDouble(100.0, 10); // 验证结果在[0, 100)范围内 assertTrue(result >= 0.0 && result < 100.0, diff --git a/hutool-core/src/test/java/cn/hutool/v7/core/util/TestRandomUtilByDoubao.java b/hutool-core/src/test/java/cn/hutool/v7/core/util/TestRandomUtilByDoubao.java index 37d8b8de8f..a7e53bd1ea 100644 --- a/hutool-core/src/test/java/cn/hutool/v7/core/util/TestRandomUtilByDoubao.java +++ b/hutool-core/src/test/java/cn/hutool/v7/core/util/TestRandomUtilByDoubao.java @@ -26,7 +26,6 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import java.math.BigDecimal; -import java.math.RoundingMode; import java.security.SecureRandom; import java.util.*; import java.util.concurrent.ThreadLocalRandom; @@ -199,7 +198,7 @@ public class TestRandomUtilByDoubao { assertTrue(doubleInRange >= min && doubleInRange < max); // 测试保留小数位数 - final double doubleWithScale = RandomUtil.randomDouble(min, max, 2, RoundingMode.HALF_UP); + final double doubleWithScale = RandomUtil.randomDouble(min, max, 2); // 验证小数位数不超过 2 位 final String doubleStr = String.valueOf(doubleWithScale); int dotIndex = doubleStr.indexOf('.'); @@ -208,7 +207,7 @@ public class TestRandomUtilByDoubao { } // 测试无范围保留小数 - final double doubleScaleOnly = RandomUtil.randomDouble(3, RoundingMode.HALF_UP); + final double doubleScaleOnly = RandomUtil.randomDouble(3); final String scaleStr = String.valueOf(doubleScaleOnly); dotIndex = scaleStr.indexOf('.'); if (dotIndex != -1) { diff --git a/pom.xml b/pom.xml index 024fc2a3ff..4349ec0ae4 100755 --- a/pom.xml +++ b/pom.xml @@ -229,16 +229,27 @@ - org.codehaus.mojo - cobertura-maven-plugin - 2.7 - - - html - xml - - - + org.jacoco + jacoco-maven-plugin + 0.8.14 + + + jacoco-prepare-agent + + prepare-agent + + + + jacoco-report + test + + report + + + ${project.build.directory}/jacoco-report + + +