1e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/*
2e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Copyright (c) 2007 Mockito contributors
3e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * This program is made available under the terms of the MIT License.
4e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */
5e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpackage org.mockito.internal.runners.util;
6e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.lang.reflect.Constructor;
8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.lang.reflect.InvocationTargetException;
9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.runners.RunnerImpl;
11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic class RunnerProvider {
13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private static boolean hasJUnit45OrHigher;
15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    static {
17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        try {
18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            Class.forName("org.junit.runners.BlockJUnit4ClassRunner");
19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            hasJUnit45OrHigher = true;
20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        } catch (Throwable t) {
21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            hasJUnit45OrHigher = false;
22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public boolean isJUnit45OrHigherAvailable() {
26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return hasJUnit45OrHigher;
27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
29e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public RunnerImpl newInstance(String runnerClassName, Class<?> constructorParam) throws Exception {
30e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        Constructor<?> constructor;
31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        try {
32e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            Class<?> runnerClass = Class.forName(runnerClassName);
33e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            constructor = runnerClass.getConstructor(Class.class.getClass());
34e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        } catch (Exception e) {
35e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            throw new RuntimeException(e);
36e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
37e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        try {
39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            return (RunnerImpl) constructor.newInstance(constructorParam);
40e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        } catch (InvocationTargetException e) {
41e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            throw e;
42e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        } catch (Exception e) {
43e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            throw new RuntimeException(e);
44e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
45e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
46e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson}