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