Skip to content

Commit

Permalink
Fixes #2061: ArgumentMatcher error messages use lambda class names (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
Marcono1234 committed Oct 17, 2020
1 parent b16ec17 commit 214d66f
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 9 deletions.
Expand Up @@ -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;

Expand Down Expand Up @@ -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);
}
}
2 changes: 1 addition & 1 deletion src/main/java/org/mockito/internal/util/StringUtil.java
Expand Up @@ -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 "<custom argument matcher>";
}
Expand Down
Expand Up @@ -13,22 +13,26 @@
public class MatcherToStringTest extends TestBase {

static class MatcherWithoutDescription implements ArgumentMatcher<Object> {
@Override
public boolean matches(Object argument) {
return false;
}
}

static class MatcherWithDescription implements ArgumentMatcher<Object> {
@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;
}
Expand All @@ -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<Object> anonymousMatcher =
new ArgumentMatcher<Object>() {
@Override
public boolean matches(Object argument) {
return false;
}
};
assertEquals("<custom argument matcher>", MatcherToString.toString(anonymousMatcher));

ArgumentMatcher<Object> 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<Object> lambdaMatcher = argument -> true;
assertEquals("<custom argument matcher>", MatcherToString.toString(lambdaMatcher));

ArgumentMatcher<Object> methodRefMatcher = lambdaMatcher::matches;
assertEquals("<custom argument matcher>", MatcherToString.toString(methodRefMatcher));
}
}
13 changes: 7 additions & 6 deletions src/test/java/org/mockito/internal/util/StringUtilTest.java
Expand Up @@ -15,15 +15,16 @@
public class StringUtilTest {

@Test
public void decamelizes_matcher() throws Exception {
public void decamelizes_matcher_name() throws Exception {
assertEquals(
"<Sentence with strong language>",
StringUtil.decamelizeMatcher("SentenceWithStrongLanguage"));
assertEquals("<W e i r d o 1>", StringUtil.decamelizeMatcher("WEIRDO1"));
assertEquals("<_>", StringUtil.decamelizeMatcher("_"));
StringUtil.decamelizeMatcherName("SentenceWithStrongLanguage"));
assertEquals("<W e i r d o 1>", StringUtil.decamelizeMatcherName("WEIRDO1"));
assertEquals("<_>", StringUtil.decamelizeMatcherName("_"));
assertEquals(
"<Has exactly 3 elements>", StringUtil.decamelizeMatcher("HasExactly3Elements"));
assertEquals("<custom argument matcher>", StringUtil.decamelizeMatcher(""));
"<Has exactly 3 elements>",
StringUtil.decamelizeMatcherName("HasExactly3Elements"));
assertEquals("<custom argument matcher>", StringUtil.decamelizeMatcherName(""));
}

@Test
Expand Down

0 comments on commit 214d66f

Please sign in to comment.