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.stubbing.answers;
6e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.exceptions.base.MockitoException;
8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.invocation.InvocationOnMock;
9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.stubbing.Answer;
10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.util.Collection;
12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.util.LinkedList;
13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/**
15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Returns elements of the collection. Keeps returning the last element forever.
16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Might be useful on occasion when you have a collection of elements to return.
17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <p>
18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <pre class="code"><code class="java">
19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *   //this:
20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *   when(mock.foo()).thenReturn(1, 2, 3);
21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *   //is equivalent to:
22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *   when(mock.foo()).thenAnswer(new ReturnsElementsOf(Arrays.asList(1, 2, 3)));
23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * </code></pre>
24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * </p>
25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *
26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <p>
27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Also you might better want to use the static factory there
28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * {@link org.mockito.AdditionalAnswers#returnsElementsOf(java.util.Collection)}
29e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * </p>
30e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *
31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * @see org.mockito.AdditionalAnswers
32e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */
33e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic class ReturnsElementsOf implements Answer<Object> {
34e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
35e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private final LinkedList<Object> elements;
36e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
37e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public ReturnsElementsOf(Collection<?> elements) {
38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (elements == null) {
39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            throw new MockitoException("ReturnsElementsOf does not accept null as constructor argument.\n" +
40e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            		"Please pass a collection instance");
41e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
42e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        this.elements = new LinkedList<Object>(elements);
43e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
44e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
45e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public Object answer(InvocationOnMock invocation) throws Throwable {
46e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (elements.size() == 1)
47e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            return elements.get(0);
48e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        else
49e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            return elements.poll();
50e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
51e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson}