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"));

Reply via email to