From 5eb12b8affd93ee907dc9a4548abd41fd4699af8 Mon Sep 17 00:00:00 2001 From: EugeneLesnov Date: Fri, 22 Jan 2021 23:49:12 +0300 Subject: [PATCH] "But invoked here" lists the invocation parameters Fixes #2058 --- .../mockito/internal/exceptions/Reporter.java | 28 +++++++++++++++---- .../checkers/NumberOfInvocationsChecker.java | 2 +- .../NumberOfInvocationsCheckerTest.java | 16 +++++++---- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/mockito/internal/exceptions/Reporter.java b/src/main/java/org/mockito/internal/exceptions/Reporter.java index 0a182178d3..c15f2131e5 100644 --- a/src/main/java/org/mockito/internal/exceptions/Reporter.java +++ b/src/main/java/org/mockito/internal/exceptions/Reporter.java @@ -10,9 +10,7 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; import org.mockito.exceptions.base.MockitoAssertionError; import org.mockito.exceptions.base.MockitoException; @@ -408,14 +406,17 @@ private static String createTooManyInvocationsMessage( } public static MockitoAssertionError neverWantedButInvoked( - DescribedInvocation wanted, List invocations) { + DescribedInvocation wanted, List invocations) { + Map locationArgs = new HashMap<>(); + invocations.forEach(inv -> locationArgs.put(inv.getLocation(), inv.getArguments())); + return new NeverWantedButInvoked( join( wanted.toString(), "Never wanted here:", new LocationImpl(), "But invoked here:", - createAllLocationsMessage(invocations))); + createAllLocationsArgsMessage(locationArgs))); } public static MockitoAssertionError tooManyActualInvocationsInOrder( @@ -439,6 +440,23 @@ private static String createAllLocationsMessage(List locations) { return sb.toString(); } + private static String createAllLocationsArgsMessage(Map locationArgs) { + if (locationArgs == null || locationArgs.isEmpty()) { + return ""; + } + StringBuilder sb = new StringBuilder(); + locationArgs.forEach((location, args) -> { + if (location == null) { + return; + } + sb.append(location) + .append(" with next arguments: ") + .append(Arrays.toString(args)) + .append("\n"); + }); + return sb.toString(); + } + private static String createTooFewInvocationsMessage( org.mockito.internal.reporting.Discrepancy discrepancy, DescribedInvocation wanted, diff --git a/src/main/java/org/mockito/internal/verification/checkers/NumberOfInvocationsChecker.java b/src/main/java/org/mockito/internal/verification/checkers/NumberOfInvocationsChecker.java index 460710cc93..78a276ef20 100644 --- a/src/main/java/org/mockito/internal/verification/checkers/NumberOfInvocationsChecker.java +++ b/src/main/java/org/mockito/internal/verification/checkers/NumberOfInvocationsChecker.java @@ -40,7 +40,7 @@ public static void checkNumberOfInvocations( new Discrepancy(wantedCount, actualCount), wanted, allLocations); } if (wantedCount == 0 && actualCount > 0) { - throw neverWantedButInvoked(wanted, getAllLocations(actualInvocations)); + throw neverWantedButInvoked(wanted, actualInvocations); } if (wantedCount < actualCount) { throw tooManyActualInvocations( diff --git a/src/test/java/org/mockito/internal/verification/checkers/NumberOfInvocationsCheckerTest.java b/src/test/java/org/mockito/internal/verification/checkers/NumberOfInvocationsCheckerTest.java index b92bb4dd1c..8b632067a3 100644 --- a/src/test/java/org/mockito/internal/verification/checkers/NumberOfInvocationsCheckerTest.java +++ b/src/test/java/org/mockito/internal/verification/checkers/NumberOfInvocationsCheckerTest.java @@ -9,6 +9,7 @@ import static org.assertj.core.api.Assertions.assertThat; +import java.util.Collections; import java.util.List; import org.hamcrest.BaseMatcher; @@ -116,16 +117,17 @@ public void shouldReportTooManyActual() throws Exception { } @Test - public void shouldReportNeverWantedButInvoked() throws Exception { - Invocation first = buildSimpleMethod().toInvocation(); + public void shouldReportNeverWantedButInvokedWithArgs() throws Exception { + Invocation invocation = buildSimpleMethodWithArgs("arg1").toInvocation(); - invocations = asList(first); - wanted = buildSimpleMethod().toInvocationMatcher(); + invocations = Collections.singletonList(invocation); + wanted = buildSimpleMethodWithArgs("arg1").toInvocationMatcher(); exception.expect(NeverWantedButInvoked.class); exception.expectMessage("Never wanted here"); exception.expectMessage("But invoked here"); - exception.expectMessage("" + first.getLocation()); + exception.expectMessage("" + invocation.getLocation()); + exception.expectMessage("with next arguments: [arg1]"); NumberOfInvocationsChecker.checkNumberOfInvocations(invocations, wanted, 0); } @@ -145,6 +147,10 @@ private InvocationBuilder buildSimpleMethod() { return new InvocationBuilder().mock(mock).simpleMethod(); } + private InvocationBuilder buildSimpleMethodWithArgs(String arg) { + return new InvocationBuilder().mock(mock).simpleMethod().args(arg); + } + private static BaseMatcher containsTimes(String value, int amount) { return new StringContainsNumberMatcher(value, amount); }