diff --git a/src/main/java/org/mockito/internal/matchers/text/MatcherToString.java b/src/main/java/org/mockito/internal/matchers/text/MatcherToString.java index 3be972e7c5..937dc34f9e 100644 --- a/src/main/java/org/mockito/internal/matchers/text/MatcherToString.java +++ b/src/main/java/org/mockito/internal/matchers/text/MatcherToString.java @@ -5,7 +5,7 @@ package org.mockito.internal.matchers.text; import static org.mockito.internal.util.ObjectMethodsGuru.isToStringMethod; -import static org.mockito.internal.util.StringUtil.decamelizeMatcher; +import static org.mockito.internal.util.StringUtil.decamelizeMatcherName; import java.lang.reflect.Method; @@ -37,6 +37,17 @@ static String toString(ArgumentMatcher matcher) { } cls = cls.getSuperclass(); } - return decamelizeMatcher(matcher.getClass().getSimpleName()); + + String matcherName; + Class matcherClass = matcher.getClass(); + // Lambdas have non-empty getSimpleName() (despite being synthetic) + // but that name is not useful for user + if (matcherClass.isSynthetic()) { + matcherName = ""; + } else { + matcherName = matcherClass.getSimpleName(); + } + + return decamelizeMatcherName(matcherName); } } diff --git a/src/main/java/org/mockito/internal/util/StringUtil.java b/src/main/java/org/mockito/internal/util/StringUtil.java index b58a36fce5..7e55666085 100644 --- a/src/main/java/org/mockito/internal/util/StringUtil.java +++ b/src/main/java/org/mockito/internal/util/StringUtil.java @@ -60,7 +60,7 @@ public static String join(String start, String linePrefix, Collection lines) return out.substring(0, out.length() - 1); // lose last EOL } - public static String decamelizeMatcher(String className) { + public static String decamelizeMatcherName(String className) { if (className.length() == 0) { return ""; } diff --git a/src/test/java/org/mockito/internal/matchers/text/MatcherToStringTest.java b/src/test/java/org/mockito/internal/matchers/text/MatcherToStringTest.java index d0d7869e8b..746ee69ea3 100644 --- a/src/test/java/org/mockito/internal/matchers/text/MatcherToStringTest.java +++ b/src/test/java/org/mockito/internal/matchers/text/MatcherToStringTest.java @@ -13,22 +13,26 @@ public class MatcherToStringTest extends TestBase { static class MatcherWithoutDescription implements ArgumentMatcher { + @Override public boolean matches(Object argument) { return false; } } static class MatcherWithDescription implements ArgumentMatcher { + @Override public boolean matches(Object argument) { return false; } + @Override public String toString() { return "*my custom description*"; } } static class MatcherWithInheritedDescription extends MatcherWithDescription { + @Override public boolean matches(Object argument) { return false; } @@ -45,4 +49,35 @@ public void better_toString_for_matchers() { "*my custom description*", MatcherToString.toString(new MatcherWithInheritedDescription())); } + + @Test + public void default_name_for_anonymous_matchers() { + ArgumentMatcher anonymousMatcher = + new ArgumentMatcher() { + @Override + public boolean matches(Object argument) { + return false; + } + }; + assertEquals("", MatcherToString.toString(anonymousMatcher)); + + ArgumentMatcher anonymousDescriptiveMatcher = + new MatcherWithDescription() { + @Override + public boolean matches(Object argument) { + return false; + } + }; + assertEquals( + "*my custom description*", MatcherToString.toString(anonymousDescriptiveMatcher)); + } + + @Test + public void default_name_for_synthetic_matchers() { + ArgumentMatcher lambdaMatcher = argument -> true; + assertEquals("", MatcherToString.toString(lambdaMatcher)); + + ArgumentMatcher methodRefMatcher = lambdaMatcher::matches; + assertEquals("", MatcherToString.toString(methodRefMatcher)); + } } diff --git a/src/test/java/org/mockito/internal/util/StringUtilTest.java b/src/test/java/org/mockito/internal/util/StringUtilTest.java index e9c40538bc..526d399264 100644 --- a/src/test/java/org/mockito/internal/util/StringUtilTest.java +++ b/src/test/java/org/mockito/internal/util/StringUtilTest.java @@ -15,15 +15,16 @@ public class StringUtilTest { @Test - public void decamelizes_matcher() throws Exception { + public void decamelizes_matcher_name() throws Exception { assertEquals( "", - StringUtil.decamelizeMatcher("SentenceWithStrongLanguage")); - assertEquals("", StringUtil.decamelizeMatcher("WEIRDO1")); - assertEquals("<_>", StringUtil.decamelizeMatcher("_")); + StringUtil.decamelizeMatcherName("SentenceWithStrongLanguage")); + assertEquals("", StringUtil.decamelizeMatcherName("WEIRDO1")); + assertEquals("<_>", StringUtil.decamelizeMatcherName("_")); assertEquals( - "", StringUtil.decamelizeMatcher("HasExactly3Elements")); - assertEquals("", StringUtil.decamelizeMatcher("")); + "", + StringUtil.decamelizeMatcherName("HasExactly3Elements")); + assertEquals("", StringUtil.decamelizeMatcherName("")); } @Test