This is an automated email from the ASF dual-hosted git repository.
garydgregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-lang.git
The following commit(s) were added to refs/heads/master by this push:
new dba5d3417 Add reflection varargs boundary tests
dba5d3417 is described below
commit dba5d341792505fbe25c36dd4d0532a19caf2764
Author: Gary Gregory <[email protected]>
AuthorDate: Mon Oct 19 16:37:21 2026 -0400
Add reflection varargs boundary tests
Verify that methods with two fixed parameters reject calls supplying
only one argument. Cover successful method and constructor invocation
with an empty varargs tail.
---
src/changes/changes.xml | 1 +
.../apache/commons/lang3/reflect/ConstructorUtilsTest.java | 10 +++++++++-
.../org/apache/commons/lang3/reflect/MethodUtilsTest.java | 12 ++++++++++++
3 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 744b29ddc..1d9dba572 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -66,6 +66,7 @@ The <action> type attribute can be add,update,fix,remove.
<action issue="LANG-441" type="fix" dev="ggregory" due-to="Sebb, Valentin
Rocher, Adarsh Kumar Omrey, Gary Gregory">DateUtils Javadoc does not fully
define round() behavior.</action>
<action issue="LANG-1838" type="fix" dev="ggregory" due-to="Aryan R.
Ganjoo, Gary Gregory">Fix resource paths for unnamed packages (#1824).</action>
<action type="fix" dev="ggregory" due-to="alhuda, Gary
Gregory">Keep EventCountCircuitBreaker event count from wrapping on int
overflow (#1825).</action>
+ <action type="fix" dev="ggregory" due-to="alhuda, Gary
Gregory">Reject varargs candidates with too few arguments in MemberUtils
(#1828).</action>
<!-- ADD -->
<!-- UPDATE -->
<action type="update" dev="ggregory" due-to="Gary Gregory">Bump
org.apache.commons:commons-parent from 105 to 106.</action>
diff --git
a/src/test/java/org/apache/commons/lang3/reflect/ConstructorUtilsTest.java
b/src/test/java/org/apache/commons/lang3/reflect/ConstructorUtilsTest.java
index b8c81ddfd..f9e643afc 100644
--- a/src/test/java/org/apache/commons/lang3/reflect/ConstructorUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/reflect/ConstructorUtilsTest.java
@@ -145,8 +145,10 @@ void verify(final String str, final String[] args) {
public static class VarArgsBean {
+ private final String[] rest;
+
public VarArgsBean(final String first, final String... rest) {
- // empty
+ this.rest = rest;
}
}
@@ -253,6 +255,12 @@ void testInvokeConstructorOnNonPublicClass() {
assertThrows(NoSuchMethodException.class, () ->
ConstructorUtils.invokeConstructor(PrivateClass.PublicInnerClass.class));
}
+ @Test
+ void testInvokeConstructorVarArgsEmptyTail() throws Exception {
+ final VarArgsBean bean =
ConstructorUtils.invokeConstructor(VarArgsBean.class, "first");
+ assertArrayEquals(new String[0], bean.rest);
+ }
+
@Test
void testInvokeConstructorVarArgsTooFewArguments() {
assertNull(ConstructorUtils.getMatchingAccessibleConstructor(VarArgsBean.class));
diff --git
a/src/test/java/org/apache/commons/lang3/reflect/MethodUtilsTest.java
b/src/test/java/org/apache/commons/lang3/reflect/MethodUtilsTest.java
index 947145999..634167872 100644
--- a/src/test/java/org/apache/commons/lang3/reflect/MethodUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/reflect/MethodUtilsTest.java
@@ -444,6 +444,10 @@ public String intLongVarArg(final int intArg, final
long... args) {
return "int, long...";
}
+ public int intStringStringVarArg(final int first, final String second,
final String... rest) {
+ return rest.length;
+ }
+
public String intStringVarArg(final int intArg, final String... args) {
return "int, String...";
}
@@ -1173,6 +1177,14 @@ void testInvokeMethod1PlusVarArgs() throws Exception {
assertNull(MethodUtils.getMatchingAccessibleMethod(TestBean.class,
"intStringVarArg"));
}
+ @Test
+ void testInvokeMethod2PlusVarArgs() throws Exception {
+ assertNull(MethodUtils.getMatchingAccessibleMethod(TestBean.class,
"intStringStringVarArg", Integer.class));
+ assertThrows(NoSuchMethodException.class, () ->
MethodUtils.invokeMethod(testBean, "intStringStringVarArg", 1));
+ assertEquals(0, MethodUtils.invokeMethod(testBean,
"intStringStringVarArg", 1, "second"));
+ assertEquals(1, MethodUtils.invokeMethod(testBean,
"intStringStringVarArg", 1, "second", "rest"));
+ }
+
@Test
void testInvokeMethodForceAccessNoArgs() throws Exception {
assertEquals("privateStringStuff()",
MethodUtils.invokeMethod(testBean, true, "privateStringStuff"));