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