1 package junitparams.internal;
2 
3 import java.lang.reflect.Method;
4 
5 import org.junit.runner.Description;
6 import org.junit.runner.notification.RunNotifier;
7 import org.junit.runners.model.Statement;
8 
9 /**
10  * Encapsulates a {@link Throwable} that was caught during initialization so that it can be
11  * thrown during execution in order to preserve previous behavior.
12  */
13 public class DeferredErrorFrameworkMethod extends InvokableFrameworkMethod {
14 
15     private final Throwable throwable;
16 
DeferredErrorFrameworkMethod(Method method, Description description, Throwable throwable)17     DeferredErrorFrameworkMethod(Method method, Description description,
18             Throwable throwable) {
19         super(method, description);
20         this.throwable = throwable;
21     }
22 
23     @Override
getInvokeStatement(Object test)24     public Statement getInvokeStatement(Object test) {
25         return new Statement() {
26             @Override
27             public void evaluate() throws Throwable {
28                 throw throwable;
29             }
30         };
31     }
32 
33     @Override
34     public void run(MethodBlockSupplier supplier, RunNotifier notifier) {
35         // Do not call the MethodBlockSupplier as that could introduce additional errors, simply
36         // throw the encapsulated Throwable immediately.
37         runMethodInvoker(notifier, getInvokeStatement(notifier), getDescription());
38     }
39 }
40