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