147d431f63a66505a645f282416659a9758a91f1cBrett Chabot/* 247d431f63a66505a645f282416659a9758a91f1cBrett Chabot * Copyright 2001-2009 OFFIS, Tammo Freese 347d431f63a66505a645f282416659a9758a91f1cBrett Chabot * 447d431f63a66505a645f282416659a9758a91f1cBrett Chabot * Licensed under the Apache License, Version 2.0 (the "License"); 547d431f63a66505a645f282416659a9758a91f1cBrett Chabot * you may not use this file except in compliance with the License. 647d431f63a66505a645f282416659a9758a91f1cBrett Chabot * You may obtain a copy of the License at 747d431f63a66505a645f282416659a9758a91f1cBrett Chabot * 847d431f63a66505a645f282416659a9758a91f1cBrett Chabot * http://www.apache.org/licenses/LICENSE-2.0 947d431f63a66505a645f282416659a9758a91f1cBrett Chabot * 1047d431f63a66505a645f282416659a9758a91f1cBrett Chabot * Unless required by applicable law or agreed to in writing, software 1147d431f63a66505a645f282416659a9758a91f1cBrett Chabot * distributed under the License is distributed on an "AS IS" BASIS, 1247d431f63a66505a645f282416659a9758a91f1cBrett Chabot * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1347d431f63a66505a645f282416659a9758a91f1cBrett Chabot * See the License for the specific language governing permissions and 1447d431f63a66505a645f282416659a9758a91f1cBrett Chabot * limitations under the License. 1547d431f63a66505a645f282416659a9758a91f1cBrett Chabot */ 1647d431f63a66505a645f282416659a9758a91f1cBrett Chabotpackage org.easymock.internal; 1747d431f63a66505a645f282416659a9758a91f1cBrett Chabot 1847d431f63a66505a645f282416659a9758a91f1cBrett Chabotimport java.io.Serializable; 1947d431f63a66505a645f282416659a9758a91f1cBrett Chabotimport java.lang.reflect.InvocationTargetException; 2047d431f63a66505a645f282416659a9758a91f1cBrett Chabot 2147d431f63a66505a645f282416659a9758a91f1cBrett Chabotimport org.easymock.IAnswer; 2247d431f63a66505a645f282416659a9758a91f1cBrett Chabot 2347d431f63a66505a645f282416659a9758a91f1cBrett Chabotpublic class Result implements IAnswer<Object>, Serializable { 2447d431f63a66505a645f282416659a9758a91f1cBrett Chabot 2547d431f63a66505a645f282416659a9758a91f1cBrett Chabot private static final long serialVersionUID = 5476251941213917681L; 2647d431f63a66505a645f282416659a9758a91f1cBrett Chabot 2747d431f63a66505a645f282416659a9758a91f1cBrett Chabot private final IAnswer<?> value; 2847d431f63a66505a645f282416659a9758a91f1cBrett Chabot 2947d431f63a66505a645f282416659a9758a91f1cBrett Chabot private final boolean shouldFillInStackTrace; 3047d431f63a66505a645f282416659a9758a91f1cBrett Chabot 3147d431f63a66505a645f282416659a9758a91f1cBrett Chabot private Result(IAnswer<?> value, boolean shouldFillInStackTrace) { 3247d431f63a66505a645f282416659a9758a91f1cBrett Chabot this.value = value; 3347d431f63a66505a645f282416659a9758a91f1cBrett Chabot this.shouldFillInStackTrace = shouldFillInStackTrace; 3447d431f63a66505a645f282416659a9758a91f1cBrett Chabot } 3547d431f63a66505a645f282416659a9758a91f1cBrett Chabot 3647d431f63a66505a645f282416659a9758a91f1cBrett Chabot public static Result createThrowResult(final Throwable throwable) { 3747d431f63a66505a645f282416659a9758a91f1cBrett Chabot class ThrowingAnswer implements IAnswer<Object>, Serializable { 3847d431f63a66505a645f282416659a9758a91f1cBrett Chabot 3947d431f63a66505a645f282416659a9758a91f1cBrett Chabot private static final long serialVersionUID = -332797751209289222L; 4047d431f63a66505a645f282416659a9758a91f1cBrett Chabot 4147d431f63a66505a645f282416659a9758a91f1cBrett Chabot public Object answer() throws Throwable { 4247d431f63a66505a645f282416659a9758a91f1cBrett Chabot throw throwable; 4347d431f63a66505a645f282416659a9758a91f1cBrett Chabot } 4447d431f63a66505a645f282416659a9758a91f1cBrett Chabot 4547d431f63a66505a645f282416659a9758a91f1cBrett Chabot @Override 4647d431f63a66505a645f282416659a9758a91f1cBrett Chabot public String toString() { 4747d431f63a66505a645f282416659a9758a91f1cBrett Chabot return "Answer throwing " + throwable; 4847d431f63a66505a645f282416659a9758a91f1cBrett Chabot } 4947d431f63a66505a645f282416659a9758a91f1cBrett Chabot } 5047d431f63a66505a645f282416659a9758a91f1cBrett Chabot return new Result(new ThrowingAnswer(), true); 5147d431f63a66505a645f282416659a9758a91f1cBrett Chabot } 5247d431f63a66505a645f282416659a9758a91f1cBrett Chabot 5347d431f63a66505a645f282416659a9758a91f1cBrett Chabot public static Result createReturnResult(final Object value) { 5447d431f63a66505a645f282416659a9758a91f1cBrett Chabot class ReturningAnswer implements IAnswer<Object>, Serializable { 5547d431f63a66505a645f282416659a9758a91f1cBrett Chabot 5647d431f63a66505a645f282416659a9758a91f1cBrett Chabot private static final long serialVersionUID = 6973893913593916866L; 5747d431f63a66505a645f282416659a9758a91f1cBrett Chabot 5847d431f63a66505a645f282416659a9758a91f1cBrett Chabot public Object answer() throws Throwable { 5947d431f63a66505a645f282416659a9758a91f1cBrett Chabot return value; 6047d431f63a66505a645f282416659a9758a91f1cBrett Chabot } 6147d431f63a66505a645f282416659a9758a91f1cBrett Chabot 6247d431f63a66505a645f282416659a9758a91f1cBrett Chabot @Override 6347d431f63a66505a645f282416659a9758a91f1cBrett Chabot public String toString() { 6447d431f63a66505a645f282416659a9758a91f1cBrett Chabot return "Answer returning " + value; 6547d431f63a66505a645f282416659a9758a91f1cBrett Chabot } 6647d431f63a66505a645f282416659a9758a91f1cBrett Chabot } 6747d431f63a66505a645f282416659a9758a91f1cBrett Chabot return new Result(new ReturningAnswer(), true); 6847d431f63a66505a645f282416659a9758a91f1cBrett Chabot } 6947d431f63a66505a645f282416659a9758a91f1cBrett Chabot 7047d431f63a66505a645f282416659a9758a91f1cBrett Chabot public static Result createDelegatingResult(final Object value) { 7147d431f63a66505a645f282416659a9758a91f1cBrett Chabot class DelegatingAnswer implements IAnswer<Object>, Serializable { 7247d431f63a66505a645f282416659a9758a91f1cBrett Chabot 7347d431f63a66505a645f282416659a9758a91f1cBrett Chabot private static final long serialVersionUID = -5699326678580460103L; 7447d431f63a66505a645f282416659a9758a91f1cBrett Chabot 7547d431f63a66505a645f282416659a9758a91f1cBrett Chabot public Object answer() throws Throwable { 7647d431f63a66505a645f282416659a9758a91f1cBrett Chabot Invocation invocation = LastControl.getCurrentInvocation(); 7747d431f63a66505a645f282416659a9758a91f1cBrett Chabot try { 7847d431f63a66505a645f282416659a9758a91f1cBrett Chabot return invocation.getMethod().invoke(value, 7947d431f63a66505a645f282416659a9758a91f1cBrett Chabot invocation.getArguments()); 8047d431f63a66505a645f282416659a9758a91f1cBrett Chabot } catch (IllegalArgumentException e) { 8147d431f63a66505a645f282416659a9758a91f1cBrett Chabot throw new IllegalArgumentException("Delegation to object [" 8247d431f63a66505a645f282416659a9758a91f1cBrett Chabot + String.valueOf(value) 8347d431f63a66505a645f282416659a9758a91f1cBrett Chabot + "] is not implementing the mocked method [" 8447d431f63a66505a645f282416659a9758a91f1cBrett Chabot + invocation.getMethod() + "]", e); 8547d431f63a66505a645f282416659a9758a91f1cBrett Chabot } catch (InvocationTargetException e) { 8647d431f63a66505a645f282416659a9758a91f1cBrett Chabot throw e.getCause(); 8747d431f63a66505a645f282416659a9758a91f1cBrett Chabot } 8847d431f63a66505a645f282416659a9758a91f1cBrett Chabot } 8947d431f63a66505a645f282416659a9758a91f1cBrett Chabot 9047d431f63a66505a645f282416659a9758a91f1cBrett Chabot @Override 9147d431f63a66505a645f282416659a9758a91f1cBrett Chabot public String toString() { 9247d431f63a66505a645f282416659a9758a91f1cBrett Chabot return "Delegated to " + value; 9347d431f63a66505a645f282416659a9758a91f1cBrett Chabot } 9447d431f63a66505a645f282416659a9758a91f1cBrett Chabot } 9547d431f63a66505a645f282416659a9758a91f1cBrett Chabot return new Result(new DelegatingAnswer(), false); 9647d431f63a66505a645f282416659a9758a91f1cBrett Chabot } 9747d431f63a66505a645f282416659a9758a91f1cBrett Chabot 9847d431f63a66505a645f282416659a9758a91f1cBrett Chabot public static Result createAnswerResult(IAnswer<?> answer) { 9947d431f63a66505a645f282416659a9758a91f1cBrett Chabot return new Result(answer, false); 10047d431f63a66505a645f282416659a9758a91f1cBrett Chabot } 10147d431f63a66505a645f282416659a9758a91f1cBrett Chabot 10247d431f63a66505a645f282416659a9758a91f1cBrett Chabot public Object answer() throws Throwable { 10347d431f63a66505a645f282416659a9758a91f1cBrett Chabot return value.answer(); 10447d431f63a66505a645f282416659a9758a91f1cBrett Chabot } 10547d431f63a66505a645f282416659a9758a91f1cBrett Chabot 10647d431f63a66505a645f282416659a9758a91f1cBrett Chabot public boolean shouldFillInStackTrace() { 10747d431f63a66505a645f282416659a9758a91f1cBrett Chabot return shouldFillInStackTrace; 10847d431f63a66505a645f282416659a9758a91f1cBrett Chabot } 10947d431f63a66505a645f282416659a9758a91f1cBrett Chabot 11047d431f63a66505a645f282416659a9758a91f1cBrett Chabot @Override 11147d431f63a66505a645f282416659a9758a91f1cBrett Chabot public String toString() { 11247d431f63a66505a645f282416659a9758a91f1cBrett Chabot return value.toString(); 11347d431f63a66505a645f282416659a9758a91f1cBrett Chabot } 11447d431f63a66505a645f282416659a9758a91f1cBrett Chabot} 115