1/*
2 * Copyright (c) 2007 Mockito contributors
3 * This program is made available under the terms of the MIT License.
4 */
5package org.mockito.internal.handler;
6
7import org.mockito.internal.InternalMockHandler;
8import org.mockito.internal.progress.HandyReturnValues;
9import org.mockito.internal.stubbing.InvocationContainer;
10import org.mockito.invocation.Invocation;
11import org.mockito.mock.MockCreationSettings;
12import org.mockito.stubbing.VoidMethodStubbable;
13
14import java.util.List;
15
16/**
17 * Protects the results from delegate MockHandler. Makes sure the results are valid.
18 *
19 * by Szczepan Faber, created at: 5/22/12
20 */
21class NullResultGuardian implements InternalMockHandler {
22    private final InternalMockHandler delegate;
23
24    public NullResultGuardian(InternalMockHandler delegate) {
25        this.delegate = delegate;
26    }
27
28    public Object handle(Invocation invocation) throws Throwable {
29        Object result = delegate.handle(invocation);
30        Class<?> returnType = invocation.getMethod().getReturnType();
31        if(result == null && returnType.isPrimitive()) {
32            //primitive values cannot be null
33            return new HandyReturnValues().returnFor(returnType);
34        } else {
35            return result;
36        }
37    }
38
39    //boring delegation:
40
41    public MockCreationSettings getMockSettings() {
42        return delegate.getMockSettings();
43    }
44
45    public VoidMethodStubbable voidMethodStubbable(Object mock) {
46        return delegate.voidMethodStubbable(mock);
47    }
48
49    public void setAnswersForStubbing(List answers) {
50        delegate.setAnswersForStubbing(answers);
51    }
52
53    public InvocationContainer getInvocationContainer() {
54        return delegate.getInvocationContainer();
55    }
56}
57