diff --git a/src/main/java/org/mockito/ArgumentMatchers.java b/src/main/java/org/mockito/ArgumentMatchers.java index de87f298a1..d11fb0a85c 100644 --- a/src/main/java/org/mockito/ArgumentMatchers.java +++ b/src/main/java/org/mockito/ArgumentMatchers.java @@ -14,6 +14,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Consumer; import java.util.regex.Pattern; import org.mockito.internal.matchers.Any; @@ -912,6 +913,21 @@ public static T argThat(ArgumentMatcher matcher) { return null; } + /** + * Allows creating custom argument matchers where matching is considered successful when the consumer given by parameter does not throw an exception. + *

+ * Typically used with {@link Mockito#verify(Object)} to execute assertions on parameters passed to the verified method invocation. + * + * @param consumer executes assertions on the verified argument + * @return null. + */ + public static T assertArg(Consumer consumer) { + return argThat(argument -> { + consumer.accept(argument); + return true; + }); + } + /** * Allows creating custom char argument matchers. *

diff --git a/src/test/java/org/mockitousage/matchers/MatchersTest.java b/src/test/java/org/mockitousage/matchers/MatchersTest.java index 777c49a063..2a80c8bfef 100644 --- a/src/test/java/org/mockitousage/matchers/MatchersTest.java +++ b/src/test/java/org/mockitousage/matchers/MatchersTest.java @@ -52,6 +52,7 @@ import java.util.RandomAccess; import java.util.regex.Pattern; +import org.junit.ComparisonFailure; import org.junit.Test; import org.mockito.ArgumentMatchers; import org.mockito.Mockito; @@ -624,4 +625,27 @@ public void nullable_matcher() throws Exception { verify(mock, times(2)).oneArg(nullable(Character.class)); } + + @Test + public void assertArg_matcher() throws Exception { + mock.oneArg("hello"); + + verify(mock).oneArg(Mockito.assertArg((String it) -> { + assertEquals("hello", it); + })); + } + + @Test + public void assertArg_matcher_fails_when_assertion_fails() throws Exception { + mock.oneArg("hello"); + + try { + verify(mock).oneArg(Mockito.assertArg((String it) -> { + assertEquals("not-hello", it); + })); + fail("Should throw an exception"); + } catch (ComparisonFailure e) { + // do nothing + } + } }