Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes #2061: ArgumentMatcher error messages use lambda class names #2071

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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