From 672b2542ac2d757501a96789ce3757ebcc486236 Mon Sep 17 00:00:00 2001 From: Lukasz Szewc Date: Sun, 28 Aug 2016 21:03:15 +0200 Subject: [PATCH] Fixes #583 fix bug when trying to capture null vararg --- .../internal/invocation/InvocationMatcher.java | 12 ++++++++++-- .../matchers/CapturingArgumentsTest.java | 13 +++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/mockito/internal/invocation/InvocationMatcher.java b/src/main/java/org/mockito/internal/invocation/InvocationMatcher.java index 66ea8f5fbf..e8affc4b25 100644 --- a/src/main/java/org/mockito/internal/invocation/InvocationMatcher.java +++ b/src/main/java/org/mockito/internal/invocation/InvocationMatcher.java @@ -141,13 +141,21 @@ private void captureVarargsPart(Invocation invocation) { for (ArgumentMatcher m : uniqueMatcherSet(indexOfVararg)) { if (m instanceof CapturesArguments) { Object rawArgument = invocation.getRawArguments()[indexOfVararg]; - for (int i = 0; i < Array.getLength(rawArgument); i++) { - ((CapturesArguments) m).captureFrom(Array.get(rawArgument, i)); + for (int i = 0; i < getLength(rawArgument); i++) { + ((CapturesArguments) m).captureFrom(getArgument(rawArgument, i)); } } } } + private int getLength(Object rawArgument) { + return rawArgument == null ? 1 : Array.getLength(rawArgument); + } + + private Object getArgument(Object rawArgument, int i) { + return rawArgument == null ? null : Array.get(rawArgument, i); + } + private int regularArgumentsSize(Invocation invocation) { return invocation.getMethod().isVarArgs() ? invocation.getRawArguments().length - 1 // ignores vararg holder array diff --git a/src/test/java/org/mockitousage/matchers/CapturingArgumentsTest.java b/src/test/java/org/mockitousage/matchers/CapturingArgumentsTest.java index 36ded3b1a3..298ea43f94 100644 --- a/src/test/java/org/mockitousage/matchers/CapturingArgumentsTest.java +++ b/src/test/java/org/mockitousage/matchers/CapturingArgumentsTest.java @@ -315,4 +315,17 @@ public void captures_correctly_when_captor_used_on_pure_vararg_method() throws E verify(mock).varargs(eq(42), argumentCaptor.capture()); Assertions.assertThat(argumentCaptor.getValue()).contains("capturedValue"); } + + @Test + public void should_capture_null_vararg() { + // given + ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(String.class); + + // when + mock.varargs(null); + + // then + verify(mock).varargs(argumentCaptor.capture()); + Assertions.assertThat(argumentCaptor.getValue()).isNull(); + } }