• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2017 Mockito contributors
3  * This program is made available under the terms of the MIT License.
4  */
5 package org.mockito.internal.invocation;
6 
7 import org.mockito.internal.exceptions.stacktrace.ConditionalStackTraceFilter;
8 import org.mockito.invocation.InvocationFactory;
9 import org.mockito.invocation.InvocationOnMock;
10 
11 import java.io.Serializable;
12 import java.util.concurrent.Callable;
13 
14 /**
15  * Interface that wraps a 'real' method of the mock object.
16  * Needed for test spies or {@link InvocationOnMock#callRealMethod()}.
17  */
18 public interface RealMethod extends Serializable {
19 
20     enum IsIllegal implements RealMethod {
21 
22         INSTANCE;
23 
24         @Override
isInvokable()25         public boolean isInvokable() {
26             return false;
27         }
28 
29         @Override
invoke()30         public Object invoke() {
31             throw new IllegalStateException();
32         }
33     }
34 
35     class FromCallable extends FromBehavior implements RealMethod {
FromCallable(final Callable<?> callable)36         public FromCallable(final Callable<?> callable) {
37             super(new InvocationFactory.RealMethodBehavior() {
38                 @Override
39                 public Object call() throws Throwable {
40                     return callable.call();
41                 }
42             });
43         }
44     }
45 
46     class FromBehavior implements RealMethod {
47 
48         private final InvocationFactory.RealMethodBehavior<?> behavior;
49 
FromBehavior(InvocationFactory.RealMethodBehavior<?> behavior)50         FromBehavior(InvocationFactory.RealMethodBehavior<?> behavior) {
51             this.behavior = behavior;
52         }
53 
54         @Override
isInvokable()55         public boolean isInvokable() {
56             return true;
57         }
58 
59         @Override
invoke()60         public Object invoke() throws Throwable {
61             try {
62                 return behavior.call();
63             } catch (Throwable t) {
64                 new ConditionalStackTraceFilter().filter(t);
65                 throw t;
66             }
67         }
68     }
69 
isInvokable()70     boolean isInvokable();
71 
invoke()72     Object invoke() throws Throwable;
73 }
74