blob: f67b8688fccb0a00f42abf996cba358d790ad3b2 [file] [log] [blame]
/*
* Copyright (c) 2016 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockito.internal.matchers.text;
import static org.mockito.internal.util.ObjectMethodsGuru.isToStringMethod;
import static org.mockito.internal.util.StringUtil.decamelizeMatcher;
import java.lang.reflect.Method;
import org.mockito.ArgumentMatcher;
/**
* Provides better toString() text for matcher that don't have toString() method declared.
*/
class MatcherToString {
/**
* Attempts to provide more descriptive toString() for given matcher.
* Searches matcher class hierarchy for toString() method. If it is found it will be used.
* If no toString() is defined for the matcher hierarchy,
* uses decamelized class name instead of default Object.toString().
* This way we can promote meaningful names for custom matchers.
*
* @param matcher
* @return
*/
static String toString(ArgumentMatcher<?> matcher) {
Class<?> cls = matcher.getClass();
while(cls != Object.class) {
Method[] methods = cls.getDeclaredMethods();
for (Method m : methods) {
if(isToStringMethod(m)) {
return matcher.toString();
}
}
cls = cls.getSuperclass();
}
return decamelizeMatcher(matcher.getClass().getSimpleName());
}
}