1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19 package org.apache.maven.surefire.junitcore;
20
21 import org.apache.maven.surefire.api.testset.TestSetFailedException;
22 import org.apache.maven.surefire.common.junit4.Notifier;
23 import org.junit.runner.Result;
24 import org.junit.runner.Runner;
25 import org.junit.runner.notification.RunListener;
26
27 /**
28 * JUnitCore solves bugs in original junit class {@link org.junit.runner.JUnitCore}.<p>
29 * The notifier method {@link org.junit.runner.notification.RunNotifier#fireTestRunFinished}
30 * is called anyway in finally block.
31 *
32 * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
33 * @since 2.19
34 * @see <a href="https://github.com/junit-team/junit/issues/1186">JUnit issue 1186</a>
35 */
36 class JUnitCore {
37 private final Notifier notifier;
38
39 JUnitCore(Notifier notifier) {
40 this.notifier = notifier;
41 }
42
43 Result run(Runner runner) throws TestSetFailedException {
44 Result result = new Result();
45 RunListener listener = result.createListener();
46 notifier.addFirstListener(listener);
47 try {
48 notifier.fireTestRunStarted(runner.getDescription());
49 runner.run(notifier);
50 } catch (Throwable e) {
51 afterException(e);
52 } finally {
53 notifier.fireTestRunFinished(result);
54 notifier.removeListener(listener);
55 afterFinished();
56 }
57 return result;
58 }
59
60 protected void afterException(Throwable e) throws TestSetFailedException {
61 throw new TestSetFailedException(e);
62 }
63
64 protected void afterFinished() {}
65 }