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.stubbing;
6
7import org.mockito.exceptions.Reporter;
8import org.mockito.internal.stubbing.answers.*;
9import org.mockito.internal.util.MockUtil;
10import org.mockito.stubbing.Answer;
11import org.mockito.stubbing.Stubber;
12
13import java.util.LinkedList;
14import java.util.List;
15
16@SuppressWarnings("unchecked")
17public class StubberImpl implements Stubber {
18
19    final List<Answer> answers = new LinkedList<Answer>();
20    private final Reporter reporter = new Reporter();
21
22    public <T> T when(T mock) {
23        MockUtil mockUtil = new MockUtil();
24
25        if (mock == null) {
26            reporter.nullPassedToWhenMethod();
27        } else {
28            if (!mockUtil.isMock(mock)) {
29                reporter.notAMockPassedToWhenMethod();
30            }
31        }
32
33        mockUtil.getMockHandler(mock).setAnswersForStubbing(answers);
34        return mock;
35    }
36
37    public Stubber doReturn(Object toBeReturned) {
38        answers.add(new Returns(toBeReturned));
39        return this;
40    }
41
42    public Stubber doThrow(Throwable toBeThrown) {
43        answers.add(new ThrowsException(toBeThrown));
44        return this;
45    }
46
47    public Stubber doThrow(Class<? extends Throwable> toBeThrown) {
48        answers.add(new ThrowsExceptionClass(toBeThrown));
49        return this;
50    }
51
52    public Stubber doNothing() {
53        answers.add(new DoesNothing());
54        return this;
55    }
56
57    public Stubber doAnswer(Answer answer) {
58        answers.add(answer);
59        return this;
60    }
61
62    public Stubber doCallRealMethod() {
63        answers.add(new CallsRealMethods());
64        return this;
65    }
66}
67