blob: 39c0247cca81ba1c36da8f8690109926822cabb8 [file] [log] [blame]
/*
* Copyright (c) 2007 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockito.internal.stubbing.defaultanswers;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import java.io.Serializable;
import java.lang.reflect.Array;
/**
* It's likely this implementation will be used by default by every Mockito 2.0 mock.
* <p>
* Currently <b>used only</b> by {@link Mockito#RETURNS_SMART_NULLS}
* <p>
* Current version of Mockito mocks by deafult use {@link ReturnsEmptyValues}
* <ul>
* <li>
* Returns appropriate primitive for primitive-returning methods
* </li>
* <li>
* Returns consistent values for primitive wrapper classes (e.g. int-returning method retuns 0 <b>and</b> Integer-returning method returns 0, too)
* </li>
* <li>
* Returns empty collection for collection-returning methods (works for most commonly used collection types)
* </li>
* <li>
* Returns empty array for array-returning methods
* </li>
* <li>
* Returns "" for String-returning method
* </li>
* <li>
* Returns description of mock for toString() method
* </li>
* <li>
* Returns non-zero for Comparable#compareTo(T other) method (see issue 184)
* </li>
* <li>
* Returns null for everything else
* </li>
* </ul>
*/
public class ReturnsMoreEmptyValues implements Answer<Object>, Serializable {
private static final long serialVersionUID = -2816745041482698471L;
private final Answer<Object> delegate = new ReturnsEmptyValues();
/* (non-Javadoc)
* @see org.mockito.stubbing.Answer#answer(org.mockito.invocation.InvocationOnMock)
*/
public Object answer(InvocationOnMock invocation) throws Throwable {
Object ret = delegate.answer(invocation);
if (ret != null) {
return ret;
}
Class<?> returnType = invocation.getMethod().getReturnType();
return returnValueFor(returnType);
}
Object returnValueFor(Class<?> type) {
if (type == String.class) {
return "";
} else if (type.isArray()) {
Class<?> componenetType = type.getComponentType();
return Array.newInstance(componenetType, 0);
}
return null;
}
}