/* * Copyright (c) 2007 Mockito contributors * This program is made available under the terms of the MIT License. */ package org.mockito; import org.mockito.internal.stubbing.answers.ReturnsArgumentAt; import org.mockito.internal.stubbing.answers.ReturnsElementsOf; import org.mockito.internal.stubbing.defaultanswers.ForwardsInvocations; import org.mockito.stubbing.Answer; import java.util.Collection; /** * Additional answers provides factory methods for less common answers. * *
Currently offer answers that can return the parameter of an invocation at a certain position. * *
See factory methods for more information : {@link #returnsFirstArg}, {@link #returnsSecondArg}, * {@link #returnsLastArg} and {@link #returnsArgAt} * * @since 1.9.5 */ @SuppressWarnings("unchecked") public class AdditionalAnswers { private static final ReturnsArgumentAt RETURNS_FIRST_ARGUMENT = new ReturnsArgumentAt(0); private static final ReturnsArgumentAt RETURNS_SECOND_ARGUMENT = new ReturnsArgumentAt(1); private static final ReturnsArgumentAt RETURNS_LAST_ARGUMENT = new ReturnsArgumentAt(-1); /** * Returns the first parameter of an invocation. * *
* This additional answer could be used at stub time using the
* then|do|will{@link org.mockito.stubbing.Answer}
methods. For example :
*
given(carKeyFob.authenticate(carKey)).will(returnsFirstArg());
* doAnswer(returnsFirstArg()).when(carKeyFob).authenticate(carKey)
*
* @param
* This additional answer could be used at stub time using the
* then|do|will{@link org.mockito.stubbing.Answer}
methods. For example :
*
given(trader.apply(leesFormula, onCreditDefaultSwap)).will(returnsSecondArg());
* doAnswer(returnsSecondArg()).when(trader).apply(leesFormula, onCreditDefaultSwap)
*
* @param
* This additional answer could be used at stub time using the
* then|do|will{@link org.mockito.stubbing.Answer}
methods. For example :
*
given(person.remember(dream1, dream2, dream3, dream4)).will(returnsLastArg());
* doAnswer(returnsLastArg()).when(person).remember(dream1, dream2, dream3, dream4)
*
* @param
* This additional answer could be used at stub time using the
* then|do|will{@link org.mockito.stubbing.Answer}
methods. For example :
*
given(person.remember(dream1, dream2, dream3, dream4)).will(returnsArgAt(3));
* doAnswer(returnsArgAt(3)).when(person).remember(dream1, dream2, dream3, dream4)
*
* @param * Useful for spies or partial mocks of objects that are difficult to mock * or spy using the usual spy API. Possible use cases: *
* The difference with the regular spy: *
*
* final class DontYouDareToMockMe implements list { ... }
*
* DontYouDareToMockMe awesomeList = new DontYouDareToMockMe();
*
* List mock = mock(List.class, delegatesTo(awesomeList));
*
*
* * This feature suffers from the same drawback as the spy. * The mock will call the delegate if you use regular when().then() stubbing style. * Since the real implementation is called this might have some side effects. * Therefore you should to use the doReturn|Throw|Answer|CallRealMethod stubbing style. Example: * *
* List listWithDelegate = mock(List.class, AdditionalAnswers.delegatesTo(awesomeList));
*
* //Impossible: real method is called so listWithDelegate.get(0) throws IndexOutOfBoundsException (the list is yet empty)
* when(listWithDelegate.get(0)).thenReturn("foo");
*
* //You have to use doReturn() for stubbing
* doReturn("foo").when(listWithDelegate).get(0);
*
*
* @param delegate The delegate to forward calls to.
* @return the answer
*
* @since 1.9.5
*/
public static *
* //this:
* when(mock.foo()).thenReturn(1, 2, 3);
*
* //is equivalent to:
* when(mock.foo()).thenAnswer(new ReturnsElementsOf(Arrays.asList(1, 2, 3)));
*
*
* @param elements The collection of elements to return.
* @return the answer
*
* @since 1.9.5
*/
public static