/* * Copyright (c) 2016 Mockito contributors * This program is made available under the terms of the MIT License. */ package org.mockito.internal.stubbing.answers; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.mockito.stubbing.Answer1; import org.mockito.stubbing.Answer2; import org.mockito.stubbing.Answer3; import org.mockito.stubbing.Answer4; import org.mockito.stubbing.Answer5; import org.mockito.stubbing.VoidAnswer1; import org.mockito.stubbing.VoidAnswer2; import org.mockito.stubbing.VoidAnswer3; import org.mockito.stubbing.VoidAnswer4; import org.mockito.stubbing.VoidAnswer5; /** * Functional interfaces to make it easy to implement answers in Java 8 * * @since 2.1.0 */ public class AnswerFunctionalInterfaces { /** * Hide constructor to avoid instantiation of class with only static methods */ private AnswerFunctionalInterfaces() { } /** * Construct an answer from a two parameter answer interface * @param answer answer interface * @param <T> return type * @param <A> input parameter 1 type * @return a new answer object */ public static <T, A> Answer<T> toAnswer(final Answer1<T, A> answer) { return new Answer<T>() { @SuppressWarnings("unchecked") public T answer(InvocationOnMock invocation) throws Throwable { return answer.answer((A)invocation.getArgument(0)); } }; } /** * Construct an answer from a two parameter answer interface * @param answer answer interface * @param <A> input parameter 1 type * @return a new answer object */ public static <A> Answer<Void> toAnswer(final VoidAnswer1<A> answer) { return new Answer<Void>() { @SuppressWarnings("unchecked") public Void answer(InvocationOnMock invocation) throws Throwable { answer.answer((A)invocation.getArgument(0)); return null; } }; } /** * Construct an answer from a two parameter answer interface * @param answer answer interface * @param <T> return type * @param <A> input parameter 1 type * @param <B> input parameter 2 type * @return a new answer object */ public static <T, A, B> Answer<T> toAnswer(final Answer2<T, A, B> answer) { return new Answer<T>() { @SuppressWarnings("unchecked") public T answer(InvocationOnMock invocation) throws Throwable { return answer.answer( (A)invocation.getArgument(0), (B)invocation.getArgument(1)); } }; } /** * Construct an answer from a two parameter answer interface * @param answer answer interface * @param <A> input parameter 1 type * @param <B> input parameter 2 type * @return a new answer object */ public static <A, B> Answer<Void> toAnswer(final VoidAnswer2<A, B> answer) { return new Answer<Void>() { @SuppressWarnings("unchecked") public Void answer(InvocationOnMock invocation) throws Throwable { answer.answer( (A)invocation.getArgument(0), (B)invocation.getArgument(1)); return null; } }; } /** * Construct an answer from a three parameter answer interface * @param answer answer interface * @param <T> return type * @param <A> input parameter 1 type * @param <B> input parameter 2 type * @param <C> input parameter 3 type * @return a new answer object */ public static <T, A, B, C> Answer<T> toAnswer(final Answer3<T, A, B, C> answer) { return new Answer<T>() { @SuppressWarnings("unchecked") public T answer(InvocationOnMock invocation) throws Throwable { return answer.answer( (A)invocation.getArgument(0), (B)invocation.getArgument(1), (C)invocation.getArgument(2)); } }; } /** * Construct an answer from a three parameter answer interface * @param answer answer interface * @param <A> input parameter 1 type * @param <B> input parameter 2 type * @param <C> input parameter 3 type * @return a new answer object */ public static <A, B, C> Answer<Void> toAnswer(final VoidAnswer3<A, B, C> answer) { return new Answer<Void>() { @SuppressWarnings("unchecked") public Void answer(InvocationOnMock invocation) throws Throwable { answer.answer( (A)invocation.getArgument(0), (B)invocation.getArgument(1), (C)invocation.getArgument(2)); return null; } }; } /** * Construct an answer from a four parameter answer interface * @param answer answer interface * @param <T> return type * @param <A> input parameter 1 type * @param <B> input parameter 2 type * @param <C> input parameter 3 type * @param <D> input parameter 4 type * @return a new answer object */ public static <T, A, B, C, D> Answer<T> toAnswer(final Answer4<T, A, B, C, D> answer) { return new Answer<T>() { @SuppressWarnings("unchecked") public T answer(InvocationOnMock invocation) throws Throwable { return answer.answer( (A)invocation.getArgument(0), (B)invocation.getArgument(1), (C)invocation.getArgument(2), (D)invocation.getArgument(3)); } }; } /** * Construct an answer from a four parameter answer interface * @param answer answer interface * @param <A> input parameter 1 type * @param <B> input parameter 2 type * @param <C> input parameter 3 type * @param <D> input parameter 4 type * @return a new answer object */ public static <A, B, C, D> Answer<Void> toAnswer(final VoidAnswer4<A, B, C, D> answer) { return new Answer<Void>() { @SuppressWarnings("unchecked") public Void answer(InvocationOnMock invocation) throws Throwable { answer.answer( (A)invocation.getArgument(0), (B)invocation.getArgument(1), (C)invocation.getArgument(2), (D)invocation.getArgument(3)); return null; } }; } /** * Construct an answer from a five parameter answer interface * @param answer answer interface * @param <T> return type * @param <A> input parameter 1 type * @param <B> input parameter 2 type * @param <C> input parameter 3 type * @param <D> input parameter 4 type * @param <E> input parameter 5 type * @return a new answer object */ public static <T, A, B, C, D, E> Answer<T> toAnswer(final Answer5<T, A, B, C, D, E> answer) { return new Answer<T>() { @SuppressWarnings("unchecked") public T answer(InvocationOnMock invocation) throws Throwable { return answer.answer( (A)invocation.getArgument(0), (B)invocation.getArgument(1), (C)invocation.getArgument(2), (D)invocation.getArgument(3), (E)invocation.getArgument(4)); } }; } /** * Construct an answer from a five parameter answer interface * @param answer answer interface * @param <A> input parameter 1 type * @param <B> input parameter 2 type * @param <C> input parameter 3 type * @param <D> input parameter 4 type * @param <E> input parameter 5 type * @return a new answer object */ public static <A, B, C, D, E> Answer<Void> toAnswer(final VoidAnswer5<A, B, C, D, E> answer) { return new Answer<Void>() { @SuppressWarnings("unchecked") public Void answer(InvocationOnMock invocation) throws Throwable { answer.answer( (A)invocation.getArgument(0), (B)invocation.getArgument(1), (C)invocation.getArgument(2), (D)invocation.getArgument(3), (E)invocation.getArgument(4)); return null; } }; } }