107630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley/*
207630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley * Copyright (C) 2016 The Android Open Source Project
307630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley *
407630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley * Licensed under the Apache License, Version 2.0 (the "License");
507630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley * you may not use this file except in compliance with the License.
607630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley * You may obtain a copy of the License at
707630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley *
807630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley *      http://www.apache.org/licenses/LICENSE-2.0
907630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley *
1007630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley * Unless required by applicable law or agreed to in writing, software
1107630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley * distributed under the License is distributed on an "AS IS" BASIS,
1207630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1307630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley * See the License for the specific language governing permissions and
1407630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley * limitations under the License.
1507630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley */
1607630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley
1707630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wileypackage android.app.test;
1807630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley
1907630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wileyimport org.mockito.invocation.InvocationOnMock;
2007630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wileyimport org.mockito.stubbing.Answer;
2107630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley
2207630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wileyimport java.lang.reflect.InvocationTargetException;
2307630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wileyimport java.lang.reflect.Method;
2407630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wileyimport java.util.Arrays;
2507630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley
2607630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley/**
2707630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley * Utilities for creating Answers for mock objects
2807630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley */
2907630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wileypublic class MockAnswerUtil {
3007630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley
3107630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley    /**
3207630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley     * Answer that calls the method in the Answer called "answer" that matches the type signature of
3307630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley     * the method being answered. An error will be thrown at runtime if the signature does not match
3407630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley     * exactly.
3507630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley     */
3607630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley    public static class AnswerWithArguments implements Answer<Object> {
3707630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley        @Override
3807630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley        public final Object answer(InvocationOnMock invocation) throws Throwable {
3907630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley            Method method = invocation.getMethod();
4007630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley            try {
4107630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley                Method implementation = getClass().getMethod("answer", method.getParameterTypes());
4207630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley                if (!implementation.getReturnType().equals(method.getReturnType())) {
4307630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley                    throw new RuntimeException("Found answer method does not have expected return "
4407630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley                            + "type. Expected: " + method.getReturnType() + ", got "
4507630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley                            + implementation.getReturnType());
4607630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley                }
4707630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley                Object[] args = invocation.getArguments();
4807630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley                try {
4907630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley                    return implementation.invoke(this, args);
5007630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley                } catch (IllegalAccessException e) {
5107630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley                    throw new RuntimeException("Error invoking answer method", e);
5207630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley                } catch (InvocationTargetException e) {
5307630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley                    throw e.getCause();
5407630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley                }
5507630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley            } catch (NoSuchMethodException e) {
5607630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley                throw new RuntimeException("Could not find answer method with the expected args "
5707630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley                        + Arrays.toString(method.getParameterTypes()), e);
5807630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley            }
5907630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley        }
6007630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley    }
6107630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley
6207630f6bd3dbc91e2622cedfd1a21822b5f1f4b5Christopher Wiley}
63