Home | History | Annotate | Download | only in test
      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 
     17 package android.app.test;
     18 
     19 import org.mockito.invocation.InvocationOnMock;
     20 import org.mockito.stubbing.Answer;
     21 
     22 import java.lang.reflect.InvocationTargetException;
     23 import java.lang.reflect.Method;
     24 import java.util.Arrays;
     25 
     26 /**
     27  * Utilities for creating Answers for mock objects
     28  */
     29 public 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