1e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/*
2e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Copyright (c) 2007 Mockito contributors
3e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * This program is made available under the terms of the MIT License.
4e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */
5e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
6e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpackage org.mockito.internal.stubbing.defaultanswers;
7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.io.Serializable;
9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.lang.reflect.Array;
10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.Mockito;
12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.invocation.InvocationOnMock;
13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.stubbing.Answer;
14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/**
16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * It's likely this implementation will be used by default by every Mockito 2.0 mock.
17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <p>
18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Currently <b>used only</b> by {@link Mockito#RETURNS_SMART_NULLS}
19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <p>
20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Current version of Mockito mocks by deafult use {@link ReturnsEmptyValues}
21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <ul>
22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <li>
23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *  Returns appropriate primitive for primitive-returning methods
24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * </li>
25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <li>
26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *  Returns consistent values for primitive wrapper classes (e.g. int-returning method retuns 0 <b>and</b> Integer-returning method returns 0, too)
27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * </li>
28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <li>
29e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *  Returns empty collection for collection-returning methods (works for most commonly used collection types)
30e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * </li>
31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <li>
32e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *  Returns empty array for array-returning methods
33e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * </li>
34e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <li>
35e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *  Returns "" for String-returning method
36e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * </li>
37e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <li>
38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *  Returns description of mock for toString() method
39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * </li>
40e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <li>
41e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *  Returns non-zero for Comparable#compareTo(T other) method (see issue 184)
42e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * </li>
43e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <li>
44e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *  Returns null for everything else
45e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * </li>
46e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * </ul>
47e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */
48e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic class ReturnsMoreEmptyValues implements Answer<Object>, Serializable {
49e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
50e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private static final long serialVersionUID = -2816745041482698471L;
51e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private Answer<Object> delegate = new ReturnsEmptyValues();
52e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
53e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    /* (non-Javadoc)
54e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @see org.mockito.stubbing.Answer#answer(org.mockito.invocation.InvocationOnMock)
55e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     */
56e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public Object answer(InvocationOnMock invocation) throws Throwable {
57e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        Object ret = delegate.answer(invocation);
58e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (ret != null) {
59e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            return ret;
60e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
61e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
62e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        Class<?> returnType = invocation.getMethod().getReturnType();
63e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return returnValueFor(returnType);
64e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
65e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
66e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    Object returnValueFor(Class<?> type) {
67e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (type == String.class) {
68e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            return "";
69e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }  else if (type.isArray()) {
70e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            Class<?> componenetType = type.getComponentType();
71e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            return Array.newInstance(componenetType, 0);
72e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
73e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return null;
74e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
75e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson}