| /* |
| * 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()); |
| } |
| |
| |
| } |