1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.app.test;
18
19import org.mockito.invocation.InvocationOnMock;
20import org.mockito.stubbing.Answer;
21
22import java.lang.reflect.InvocationTargetException;
23import java.lang.reflect.Method;
24import java.util.Arrays;
25
26/**
27 * Utilities for creating Answers for mock objects
28 */
29public class MockAnswerUtil {
30
31    /**
32     * Answer that calls the method in the Answer called "answer" that matches the type signature of
33     * the method being answered. An error will be thrown at runtime if the signature does not match
34     * exactly.
35     */
36    public static class AnswerWithArguments implements Answer<Object> {
37        @Override
38        public final Object answer(InvocationOnMock invocation) throws Throwable {
39            Method method = invocation.getMethod();
40            try {
41                Method implementation = getClass().getMethod("answer", method.getParameterTypes());
42                if (!implementation.getReturnType().equals(method.getReturnType())) {
43                    throw new RuntimeException("Found answer method does not have expected return "
44                            + "type. Expected: " + method.getReturnType() + ", got "
45                            + implementation.getReturnType());
46                }
47                Object[] args = invocation.getArguments();
48                try {
49                    return implementation.invoke(this, args);
50                } catch (IllegalAccessException e) {
51                    throw new RuntimeException("Error invoking answer method", e);
52                } catch (InvocationTargetException e) {
53                    throw e.getCause();
54                }
55            } catch (NoSuchMethodException e) {
56                throw new RuntimeException("Could not find answer method with the expected args "
57                        + Arrays.toString(method.getParameterTypes()), e);
58            }
59        }
60    }
61
62}
63