This is an automated email from the ASF dual-hosted git repository.

olamy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-surefire.git


The following commit(s) were added to refs/heads/master by this push:
     new 5aeca1971 [SUREFIRE-1643] surefire junit5 parallel tests (#815)
5aeca1971 is described below

commit 5aeca19716dedc4cbcab8d68dfc74a99f50ce9ee
Author: Olivier Lamy <ol...@apache.org>
AuthorDate: Sun Mar 23 21:50:12 2025 +1000

    [SUREFIRE-1643] surefire junit5 parallel tests (#815)
    
    * [SUREFIRE-1643] Make surefire junit5 supporting parallel execution and 
not mixing result when re running tests
    
    
    ---------
    
    Signed-off-by: Olivier Lamy <ol...@apache.org>
---
 Jenkinsfile                                        | 13 ++-
 maven-failsafe-plugin/pom.xml                      | 24 ------
 .../plugin/surefire/AbstractSurefireMojo.java      | 19 ++++-
 .../maven/plugin/surefire/CommonReflector.java     |  9 +-
 .../surefire/StartupReportConfiguration.java       | 16 +++-
 .../surefire/report/DefaultReporterFactory.java    |  3 +-
 .../surefire/report/StatelessXmlReporter.java      |  4 +-
 .../plugin/surefire/report/TestSetRunListener.java | 69 ++++++++++-----
 .../plugin/surefire/report/WrappedReportEntry.java |  2 +-
 .../maven/plugin/surefire/CommonReflectorTest.java |  4 +-
 .../maven/plugin/surefire/MojoMocklessTest.java    |  7 +-
 .../surefire/booterclient/ForkStarterTest.java     |  7 +-
 .../booterclient/TestSetMockReporterFactory.java   |  4 +-
 .../maven/plugin/surefire/extensions/E2ETest.java  |  4 +-
 .../extensions/EventConsumerThreadTest.java        |  2 +
 .../report/DefaultReporterFactoryTest.java         | 10 ++-
 maven-surefire-plugin/pom.xml                      | 24 ------
 maven-surefire-report-plugin/pom.xml               | 24 ------
 pom.xml                                            |  2 +-
 .../api/booter/ForkingReporterFactory.java         |  3 +-
 .../api/report/ReporterFactoryOptions.java         | 56 +++++++++++++
 .../api/util/internal/AsyncSocketTest.java         |  2 +
 .../surefire/booter/SurefireReflectorTest.java     |  7 +-
 surefire-its/pom.xml                               | 16 +++-
 .../maven/surefire/its/jiras/Surefire1643IT.java   | 75 +++++++++++++++++
 .../src/test/java/surefire1144/Test1.java          | 16 ++--
 .../surefire-1643-parallel-junit5/.mvn/jvm.config  |  0
 .../.mvn/maven.config                              |  0
 .../surefire-1643-parallel-junit5/pom.xml          | 97 ++++++++++++++++++++++
 .../src/main/java/io/olamy/App.java                | 10 +++
 .../src/test/java/io/olamy/App1Test.java           | 30 +++++++
 .../src/test/java/io/olamy/App2Test.java           | 30 +++++++
 .../src/test/java/io/olamy/App3Test.java           | 30 +++++++
 .../src/test/java/io/olamy/App4Test.java           | 30 +++++++
 .../src/test/java/io/olamy/App5Test.java           | 30 +++++++
 .../junitplatform/JUnitPlatformProvider.java       | 18 +++-
 .../maven/surefire/junitcore/JUnitCoreTester.java  |  4 +-
 37 files changed, 555 insertions(+), 146 deletions(-)

diff --git a/Jenkinsfile b/Jenkinsfile
index 483c85464..ddb5f8483 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -21,19 +21,18 @@
 
 properties(
     [
-        buildDiscarder(logRotator(artifactDaysToKeepStr: env.BRANCH_NAME == 
'master' ? '14' : '7',
-                                  artifactNumToKeepStr: '50',
+        buildDiscarder(logRotator(artifactNumToKeepStr: env.BRANCH_NAME == 
'master' ? '15' : '5',
                                   daysToKeepStr: env.BRANCH_NAME == 'master' ? 
'30' : '14',
                                   numToKeepStr: env.BRANCH_NAME == 'master' ? 
'20' : '10')
-        ),
-        disableConcurrentBuilds()
+        )//,
+        //disableConcurrentBuilds()
     ]
 )
 // final def oses = ['linux':'ubuntu && maven', 'windows':'windows-he']
-final def oses = ['linux':'ubuntu && maven']
+final def oses = ['linux':'ubuntu']
 final def mavens = env.BRANCH_NAME == 'master' ? ['3.x.x', '3.6.3'] : ['3.x.x']
 // all non-EOL versions and the first EA
-final def jdks = [20, 17, 11, 8]
+final def jdks = [21, 17, 11, 8]
 
 final def options = ['-e', '-V', '-B', '-nsu', '-P', 'run-its']
 final def goals = ['clean', 'install']
@@ -134,7 +133,7 @@ def buildProcess(String stageKey, String jdkName, String 
mvnName, goals, options
         println "Maven Local Repository = ${mvnLocalRepoDir}."
         assert mvnLocalRepoDir != null : 'Local Maven Repository is undefined.'
 
-        def properties = ["-Djacoco.skip=${!makeReports}", 
"\"-Dmaven.repo.local=${mvnLocalRepoDir}\""]
+        def properties = ["-Papache.ci -Djacoco.skip=${!makeReports}", 
"\"-Dmaven.repo.local=${mvnLocalRepoDir}\""]
         def cmd = ['mvn'] + goals + options + properties
 
         stage("build ${stageKey}") {
diff --git a/maven-failsafe-plugin/pom.xml b/maven-failsafe-plugin/pom.xml
index bd4bf51c9..3ba6e676b 100644
--- a/maven-failsafe-plugin/pom.xml
+++ b/maven-failsafe-plugin/pom.xml
@@ -233,30 +233,6 @@
   </reporting>
 
   <profiles>
-    <profile>
-      <id>ci</id>
-      <activation>
-        <property>
-          <name>enableCiProfile</name>
-          <value>true</value>
-        </property>
-      </activation>
-      <build>
-        <plugins>
-          <plugin>
-            <artifactId>maven-docck-plugin</artifactId>
-            <version>1.2</version>
-            <executions>
-              <execution>
-                <goals>
-                  <goal>check</goal>
-                </goals>
-              </execution>
-            </executions>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
     <profile>
       <id>run-its</id>
       <build>
diff --git 
a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
 
b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
index 18a7c51fb..42a769c46 100644
--- 
a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
+++ 
b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
@@ -85,6 +85,7 @@
 import org.apache.maven.surefire.api.booter.Shutdown;
 import org.apache.maven.surefire.api.cli.CommandLineOption;
 import org.apache.maven.surefire.api.report.ReporterConfiguration;
+import org.apache.maven.surefire.api.report.ReporterFactoryOptions;
 import org.apache.maven.surefire.api.suite.RunResult;
 import org.apache.maven.surefire.api.testset.DirectoryScannerParameters;
 import org.apache.maven.surefire.api.testset.RunOrderParameters;
@@ -2056,7 +2057,8 @@ private Artifact getShadefireArtifact() {
         return 
getPluginArtifactMap().get("org.apache.maven.surefire:surefire-shadefire");
     }
 
-    private StartupReportConfiguration getStartupReportConfiguration(String 
configChecksum, boolean isForking) {
+    private StartupReportConfiguration getStartupReportConfiguration(
+            String configChecksum, boolean isForking, ProviderInfo 
providerInfo) {
         SurefireStatelessReporter xmlReporter =
                 statelessTestsetReporter == null ? new 
SurefireStatelessReporter() : statelessTestsetReporter;
 
@@ -2071,6 +2073,11 @@ private StartupReportConfiguration 
getStartupReportConfiguration(String configCh
                 ? new SurefireStatelessTestsetInfoReporter()
                 : statelessTestsetInfoReporter;
 
+        // SUREFIRE-1643 we can force this here as junit5 will need this for 
multi thread test
+        ReporterFactoryOptions reporterFactoryOptions = new 
ReporterFactoryOptions();
+        if 
("org.apache.maven.surefire.junitplatform.JUnitPlatformProvider".equals(providerInfo.getProviderName()))
 {
+            reporterFactoryOptions.setStatPerSourceName(true);
+        }
         return new StartupReportConfiguration(
                 isUseFile(),
                 isPrintSummary(),
@@ -2089,7 +2096,8 @@ private StartupReportConfiguration 
getStartupReportConfiguration(String configCh
                 isEnablePropertiesElement(),
                 xmlReporter,
                 outReporter,
-                testsetReporter);
+                testsetReporter,
+                reporterFactoryOptions);
     }
 
     private boolean isSpecificTestSpecified() {
@@ -2317,7 +2325,9 @@ private ForkStarter createForkStarter(
                 platform,
                 resolvedJavaModularityResult);
         String configChecksum = getConfigChecksum();
-        StartupReportConfiguration startupReportConfiguration = 
getStartupReportConfiguration(configChecksum, true);
+        StartupReportConfiguration startupReportConfiguration =
+                getStartupReportConfiguration(configChecksum, true, provider);
+
         ProviderConfiguration providerConfiguration = 
createProviderConfiguration(runOrderParameters);
         return new ForkStarter(
                 providerConfiguration,
@@ -2345,7 +2355,8 @@ private InPluginVMSurefireStarter createInprocessStarter(
                 platform,
                 new ResolvePathResultWrapper(null, true));
         String configChecksum = getConfigChecksum();
-        StartupReportConfiguration startupReportConfiguration = 
getStartupReportConfiguration(configChecksum, false);
+        StartupReportConfiguration startupReportConfiguration =
+                getStartupReportConfiguration(configChecksum, false, provider);
         ProviderConfiguration providerConfiguration = 
createProviderConfiguration(runOrderParameters);
         return new InPluginVMSurefireStarter(
                 startupConfiguration, providerConfiguration, 
startupReportConfiguration, getConsoleLogger(), platform);
diff --git 
a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/CommonReflector.java
 
b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/CommonReflector.java
index e902722b4..83bf6a0d5 100644
--- 
a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/CommonReflector.java
+++ 
b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/CommonReflector.java
@@ -29,6 +29,7 @@
 import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
 import org.apache.maven.plugin.surefire.log.api.ConsoleLoggerDecorator;
 import org.apache.maven.plugin.surefire.report.DefaultReporterFactory;
+import org.apache.maven.surefire.api.report.ReporterFactoryOptions;
 import org.apache.maven.surefire.api.util.SurefireReflectionException;
 
 import static 
org.apache.maven.surefire.api.util.ReflectionUtils.getConstructor;
@@ -44,6 +45,7 @@ public class CommonReflector {
     private final Class<?> statelessTestsetReporter;
     private final Class<?> consoleOutputReporter;
     private final Class<?> statelessTestsetInfoReporter;
+    private final Class<?> reporterFactoryOptions;
     private final ClassLoader surefireClassLoader;
 
     public CommonReflector(@Nonnull ClassLoader surefireClassLoader) {
@@ -56,6 +58,7 @@ public CommonReflector(@Nonnull ClassLoader 
surefireClassLoader) {
             consoleOutputReporter = 
surefireClassLoader.loadClass(SurefireConsoleOutputReporter.class.getName());
             statelessTestsetInfoReporter =
                     
surefireClassLoader.loadClass(SurefireStatelessTestsetInfoReporter.class.getName());
+            reporterFactoryOptions = 
surefireClassLoader.loadClass(ReporterFactoryOptions.class.getName());
         } catch (ClassNotFoundException e) {
             throw new SurefireReflectionException(e);
         }
@@ -90,7 +93,8 @@ private Object createStartupReportConfiguration(@Nonnull 
StartupReportConfigurat
                 boolean.class,
                 statelessTestsetReporter,
                 consoleOutputReporter,
-                statelessTestsetInfoReporter);
+                statelessTestsetInfoReporter,
+                reporterFactoryOptions);
         Object[] params = {
             reporterConfiguration.isUseFile(),
             reporterConfiguration.isPrintSummary(),
@@ -109,7 +113,8 @@ private Object createStartupReportConfiguration(@Nonnull 
StartupReportConfigurat
             reporterConfiguration.isEnablePropertiesElement(),
             reporterConfiguration.getXmlReporter().clone(surefireClassLoader),
             
reporterConfiguration.getConsoleOutputReporter().clone(surefireClassLoader),
-            
reporterConfiguration.getTestsetReporter().clone(surefireClassLoader)
+            
reporterConfiguration.getTestsetReporter().clone(surefireClassLoader),
+            
reporterConfiguration.getReporterFactoryOptions().clone(surefireClassLoader)
         };
         return newInstance(constructor, params);
     }
diff --git 
a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/StartupReportConfiguration.java
 
b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/StartupReportConfiguration.java
index 89e6614f3..cd805c7c7 100644
--- 
a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/StartupReportConfiguration.java
+++ 
b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/StartupReportConfiguration.java
@@ -35,6 +35,7 @@
 import org.apache.maven.plugin.surefire.report.TestSetStats;
 import org.apache.maven.plugin.surefire.report.WrappedReportEntry;
 import org.apache.maven.plugin.surefire.runorder.StatisticsReporter;
+import org.apache.maven.surefire.api.report.ReporterFactoryOptions;
 import org.apache.maven.surefire.extensions.ConsoleOutputReportEventListener;
 import org.apache.maven.surefire.extensions.StatelessReportEventListener;
 import 
org.apache.maven.surefire.extensions.StatelessTestsetInfoConsoleReportEventListener;
@@ -97,6 +98,8 @@ public final class StartupReportConfiguration {
 
     private StatisticsReporter statisticsReporter;
 
+    private final ReporterFactoryOptions reporterFactoryOptions;
+
     /**
      * @since 3.3.1
      */
@@ -119,7 +122,8 @@ public StartupReportConfiguration(
             boolean enablePropertiesElement,
             SurefireStatelessReporter xmlReporter,
             SurefireConsoleOutputReporter consoleOutputReporter,
-            SurefireStatelessTestsetInfoReporter testsetReporter) {
+            SurefireStatelessTestsetInfoReporter testsetReporter,
+            ReporterFactoryOptions reporterFactoryOptions) {
         this.useFile = useFile;
         this.printSummary = printSummary;
         this.reportFormat = reportFormat;
@@ -141,6 +145,7 @@ public StartupReportConfiguration(
         this.xmlReporter = xmlReporter;
         this.consoleOutputReporter = consoleOutputReporter;
         this.testsetReporter = testsetReporter;
+        this.reporterFactoryOptions = reporterFactoryOptions;
     }
 
     @SuppressWarnings("checkstyle:parameternumber")
@@ -180,7 +185,8 @@ public StartupReportConfiguration(
                 true,
                 xmlReporter,
                 consoleOutputReporter,
-                testsetReporter);
+                testsetReporter,
+                new ReporterFactoryOptions(false));
     }
 
     public boolean isUseFile() {
@@ -220,7 +226,7 @@ public StatelessReportEventListener<WrappedReportEntry, 
TestSetStats> instantiat
         // In the in-plugin execution of parallel JUnit4.7 with rerun the map 
must be shared because reports and
         // listeners are in ThreadLocal, see 
Surefire1122ParallelAndFlakyTestsIT.
         Map<String, Deque<WrappedReportEntry>> testClassMethodRunHistory =
-                isForking ? new ConcurrentHashMap<String, 
Deque<WrappedReportEntry>>() : this.testClassMethodRunHistory;
+                isForking ? new ConcurrentHashMap<>() : 
this.testClassMethodRunHistory;
 
         DefaultStatelessReportMojoConfiguration xmlReporterConfig = new 
DefaultStatelessReportMojoConfiguration(
                 resolveReportsDirectory(forkNumber),
@@ -319,4 +325,8 @@ public SurefireStatelessTestsetInfoReporter 
getTestsetReporter() {
     private boolean shouldReportToConsole() {
         return isUseFile() ? isPrintSummary() : isRedirectTestOutputToFile() 
|| isBriefOrPlainFormat();
     }
+
+    public ReporterFactoryOptions getReporterFactoryOptions() {
+        return reporterFactoryOptions;
+    }
 }
diff --git 
a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactory.java
 
b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactory.java
index cde479eac..f95c061ab 100644
--- 
a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactory.java
+++ 
b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactory.java
@@ -103,7 +103,8 @@ public TestReportListener<TestOutputReportEntry> 
createTestReportListener() {
                 reportConfiguration.isTrimStackTrace(),
                 PLAIN.equals(reportConfiguration.getReportFormat()),
                 reportConfiguration.isBriefOrPlainFormat(),
-                consoleLogger);
+                consoleLogger,
+                
reportConfiguration.getReporterFactoryOptions().isStatPerSourceName());
         addListener(testSetRunListener);
         return testSetRunListener;
     }
diff --git 
a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/StatelessXmlReporter.java
 
b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/StatelessXmlReporter.java
index 7724b1210..d658737ce 100644
--- 
a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/StatelessXmlReporter.java
+++ 
b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/StatelessXmlReporter.java
@@ -20,12 +20,12 @@
 
 import java.io.BufferedOutputStream;
 import java.io.File;
-import java.io.FileOutputStream;
 import java.io.FilterOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
+import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.Deque;
 import java.util.LinkedHashMap;
@@ -392,7 +392,7 @@ private OutputStream getOutputStream(WrappedReportEntry 
testSetReportEntry) thro
         reportFile.delete();
         //noinspection ResultOfMethodCallIgnored
         reportDir.mkdirs();
-        return new BufferedOutputStream(new FileOutputStream(reportFile), 64 * 
1024);
+        return new 
BufferedOutputStream(Files.newOutputStream(reportFile.toPath()), 64 * 1024);
     }
 
     private static OutputStreamWriter getWriter(OutputStream fos) {
diff --git 
a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetRunListener.java
 
b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetRunListener.java
index 5e90fb055..6e79c0501 100644
--- 
a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetRunListener.java
+++ 
b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetRunListener.java
@@ -22,7 +22,9 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Queue;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.ConcurrentMap;
 
 import org.apache.maven.plugin.surefire.runorder.StatisticsReporter;
 import org.apache.maven.surefire.api.report.ReportEntry;
@@ -48,7 +50,14 @@
 public class TestSetRunListener implements 
TestReportListener<TestOutputReportEntry> {
     private final Queue<TestMethodStats> testMethodStats = new 
ConcurrentLinkedQueue<>();
 
-    private final TestSetStats detailsForThis;
+    /**
+     * will be used only if report entry have a sourceName other than that 
#currentTestSetStats will be used
+     * it looks some provider doesn't provide enough information so we assume 
to use previous technique
+     * class field (this is definitely hackish)
+     */
+    private final ConcurrentMap<String, TestSetStats> detailsPerSource = new 
ConcurrentHashMap<>();
+
+    private final TestSetStats currentTestSetStats;
 
     private final ConsoleOutputReportEventListener testOutputReceiver;
 
@@ -64,6 +73,12 @@ public class TestSetRunListener implements 
TestReportListener<TestOutputReportEn
 
     private final Object lock;
 
+    private final boolean trimStackTrace;
+
+    private final boolean isPlainFormat;
+
+    private final boolean statPerSourceName;
+
     private Utf8RecodingDeferredFileOutputStream testStdOut = 
initDeferred("stdout");
 
     private Utf8RecodingDeferredFileOutputStream testStdErr = 
initDeferred("stderr");
@@ -78,15 +93,19 @@ public TestSetRunListener(
             boolean trimStackTrace,
             boolean isPlainFormat,
             boolean briefOrPlainFormat,
-            Object lock) {
+            Object lock,
+            boolean statPerSourceName) {
         this.consoleReporter = consoleReporter;
         this.fileReporter = fileReporter;
         this.statisticsReporter = statisticsReporter;
         this.simpleXMLReporter = simpleXMLReporter;
         this.testOutputReceiver = testOutputReceiver;
         this.briefOrPlainFormat = briefOrPlainFormat;
-        detailsForThis = new TestSetStats(trimStackTrace, isPlainFormat);
+        this.trimStackTrace = trimStackTrace;
+        this.isPlainFormat = isPlainFormat;
+        this.currentTestSetStats = new TestSetStats(trimStackTrace, 
isPlainFormat);
         this.lock = lock;
+        this.statPerSourceName = statPerSourceName;
     }
 
     @Override
@@ -164,9 +183,17 @@ public void writeTestOutput(TestOutputReportEntry 
reportEntry) {
         }
     }
 
+    private TestSetStats getTestSetStats(ReportEntry report) {
+        if (statPerSourceName) {
+            return detailsPerSource.computeIfAbsent(
+                    report.getSourceName(), s -> new 
TestSetStats(trimStackTrace, isPlainFormat));
+        }
+        return currentTestSetStats;
+    }
+
     @Override
     public void testSetStarting(TestSetReportEntry report) {
-        detailsForThis.testSetStart();
+        getTestSetStats(report).testSetStart();
         consoleReporter.testSetStarting(report);
         testOutputReceiver.testSetStarting(report);
     }
@@ -187,20 +214,20 @@ private void clearCapture() {
     @Override
     public void testSetCompleted(TestSetReportEntry report) {
         final WrappedReportEntry wrap = wrapTestSet(report);
-        final List<String> testResults =
-                briefOrPlainFormat ? detailsForThis.getTestResults() : 
Collections.<String>emptyList();
-        fileReporter.testSetCompleted(wrap, detailsForThis, testResults);
-        simpleXMLReporter.testSetCompleted(wrap, detailsForThis);
+        TestSetStats testSetStats = getTestSetStats(report);
+        final List<String> testResults = briefOrPlainFormat ? 
testSetStats.getTestResults() : Collections.emptyList();
+        fileReporter.testSetCompleted(wrap, testSetStats, testResults);
+        simpleXMLReporter.testSetCompleted(wrap, testSetStats);
         statisticsReporter.testSetCompleted();
-        consoleReporter.testSetCompleted(wrap, detailsForThis, testResults);
+        consoleReporter.testSetCompleted(wrap, testSetStats, testResults);
         testOutputReceiver.testSetCompleted(wrap);
         consoleReporter.reset();
 
         wrap.getStdout().free();
         wrap.getStdErr().free();
 
-        addTestMethodStats();
-        detailsForThis.reset();
+        addTestMethodStats(report);
+        testSetStats.reset();
         clearCapture();
     }
 
@@ -210,13 +237,13 @@ public void testSetCompleted(TestSetReportEntry report) {
 
     @Override
     public void testStarting(ReportEntry report) {
-        detailsForThis.testStart();
+        getTestSetStats(report).testStart();
     }
 
     @Override
     public void testSucceeded(ReportEntry reportEntry) {
         WrappedReportEntry wrapped = wrap(reportEntry, SUCCESS);
-        detailsForThis.testSucceeded(wrapped);
+        getTestSetStats(reportEntry).testSucceeded(wrapped);
         statisticsReporter.testSucceeded(reportEntry);
         clearCapture();
     }
@@ -224,7 +251,7 @@ public void testSucceeded(ReportEntry reportEntry) {
     @Override
     public void testError(ReportEntry reportEntry) {
         WrappedReportEntry wrapped = wrap(reportEntry, ERROR);
-        detailsForThis.testError(wrapped);
+        getTestSetStats(reportEntry).testError(wrapped);
         statisticsReporter.testError(reportEntry);
         clearCapture();
     }
@@ -232,7 +259,7 @@ public void testError(ReportEntry reportEntry) {
     @Override
     public void testFailed(ReportEntry reportEntry) {
         WrappedReportEntry wrapped = wrap(reportEntry, FAILURE);
-        detailsForThis.testFailure(wrapped);
+        getTestSetStats(reportEntry).testFailure(wrapped);
         statisticsReporter.testFailed(reportEntry);
         clearCapture();
     }
@@ -244,7 +271,7 @@ public void testFailed(ReportEntry reportEntry) {
     @Override
     public void testSkipped(ReportEntry reportEntry) {
         WrappedReportEntry wrapped = wrap(reportEntry, SKIPPED);
-        detailsForThis.testSkipped(wrapped);
+        getTestSetStats(reportEntry).testSkipped(wrapped);
         statisticsReporter.testSkipped(reportEntry);
         clearCapture();
     }
@@ -263,7 +290,7 @@ private WrappedReportEntry wrap(ReportEntry other, 
ReportEntryType reportEntryTy
         int estimatedElapsed = 0;
         if (reportEntryType != SKIPPED) {
             Integer etime = other.getElapsed();
-            estimatedElapsed = etime == null ? 
detailsForThis.getElapsedSinceLastStart() : etime;
+            estimatedElapsed = etime == null ? 
getTestSetStats(other).getElapsedSinceLastStart() : etime;
         }
 
         return new WrappedReportEntry(other, reportEntryType, 
estimatedElapsed, testStdOut, testStdErr);
@@ -273,7 +300,9 @@ private WrappedReportEntry wrapTestSet(TestSetReportEntry 
other) {
         return new WrappedReportEntry(
                 other,
                 null,
-                other.getElapsed() != null ? other.getElapsed() : 
detailsForThis.getElapsedSinceTestSetStart(),
+                other.getElapsed() != null
+                        ? other.getElapsed()
+                        : getTestSetStats(other).getElapsedSinceTestSetStart(),
                 testStdOut,
                 testStdErr,
                 other.getSystemProperties());
@@ -283,8 +312,8 @@ public void close() {
         testOutputReceiver.close();
     }
 
-    private void addTestMethodStats() {
-        for (WrappedReportEntry reportEntry : 
detailsForThis.getReportEntries()) {
+    private void addTestMethodStats(TestSetReportEntry report) {
+        for (WrappedReportEntry reportEntry : 
getTestSetStats(report).getReportEntries()) {
             TestMethodStats methodStats = new TestMethodStats(
                     reportEntry.getClassMethodName(),
                     reportEntry.getReportEntryType(),
diff --git 
a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/WrappedReportEntry.java
 
b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/WrappedReportEntry.java
index f661a003f..c443d27cb 100644
--- 
a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/WrappedReportEntry.java
+++ 
b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/WrappedReportEntry.java
@@ -81,7 +81,7 @@ public WrappedReportEntry(
             Integer estimatedElapsed,
             Utf8RecodingDeferredFileOutputStream stdout,
             Utf8RecodingDeferredFileOutputStream stdErr) {
-        this(original, reportEntryType, estimatedElapsed, stdout, stdErr, 
Collections.<String, String>emptyMap());
+        this(original, reportEntryType, estimatedElapsed, stdout, stdErr, 
Collections.emptyMap());
     }
 
     @Override
diff --git 
a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/CommonReflectorTest.java
 
b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/CommonReflectorTest.java
index 6fd82d6cb..510d5d1d5 100644
--- 
a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/CommonReflectorTest.java
+++ 
b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/CommonReflectorTest.java
@@ -27,6 +27,7 @@
 import org.apache.maven.plugin.surefire.log.api.ConsoleLoggerDecorator;
 import org.apache.maven.plugin.surefire.log.api.PrintStreamLogger;
 import org.apache.maven.plugin.surefire.report.DefaultReporterFactory;
+import org.apache.maven.surefire.api.report.ReporterFactoryOptions;
 import org.hamcrest.MatcherAssert;
 import org.junit.Before;
 import org.junit.Test;
@@ -86,7 +87,8 @@ public void setup() {
                 true,
                 xmlReporter,
                 consoleOutputReporter,
-                infoReporter);
+                infoReporter,
+                new ReporterFactoryOptions());
 
         consoleLogger = mock(ConsoleLogger.class);
     }
diff --git 
a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/MojoMocklessTest.java
 
b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/MojoMocklessTest.java
index 1ff8487d8..0f952d76e 100644
--- 
a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/MojoMocklessTest.java
+++ 
b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/MojoMocklessTest.java
@@ -37,6 +37,7 @@
 import org.apache.maven.surefire.api.util.DefaultScanResult;
 import org.apache.maven.surefire.api.util.SureFireFileManager;
 import org.apache.maven.surefire.extensions.ForkNodeFactory;
+import org.apache.maven.surefire.providerapi.ProviderInfo;
 import org.junit.Test;
 import org.slf4j.Logger;
 
@@ -55,7 +56,8 @@ public class MojoMocklessTest {
     @Test
     public void testGetStartupReportConfiguration() throws Exception {
         AbstractSurefireMojo surefirePlugin = new Mojo(null, null);
-        StartupReportConfiguration config = invokeMethod(surefirePlugin, 
"getStartupReportConfiguration", "", false);
+        StartupReportConfiguration config =
+                invokeMethod(surefirePlugin, "getStartupReportConfiguration", 
"", false, mock(ProviderInfo.class));
 
         
assertThat(config.getXmlReporter()).isNotNull().isInstanceOf(SurefireStatelessReporter.class);
 
@@ -74,7 +76,8 @@ public void testGetStartupReportConfiguration2() throws 
Exception {
         setInternalState(surefirePlugin, "consoleOutputReporter", 
consoleReporter);
         setInternalState(surefirePlugin, "statelessTestsetInfoReporter", 
testsetInfoReporter);
 
-        StartupReportConfiguration config = invokeMethod(surefirePlugin, 
"getStartupReportConfiguration", "", false);
+        StartupReportConfiguration config =
+                invokeMethod(surefirePlugin, "getStartupReportConfiguration", 
"", false, mock(ProviderInfo.class));
 
         assertThat(config.getXmlReporter()).isNotNull().isSameAs(xmlReporter);
 
diff --git 
a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ForkStarterTest.java
 
b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ForkStarterTest.java
index b16765038..6a774ace8 100644
--- 
a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ForkStarterTest.java
+++ 
b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ForkStarterTest.java
@@ -45,6 +45,7 @@
 import org.apache.maven.plugin.surefire.report.DefaultReporterFactory;
 import org.apache.maven.surefire.api.booter.Shutdown;
 import org.apache.maven.surefire.api.report.ReporterConfiguration;
+import org.apache.maven.surefire.api.report.ReporterFactoryOptions;
 import org.apache.maven.surefire.booter.AbstractPathConfiguration;
 import org.apache.maven.surefire.booter.ClassLoaderConfiguration;
 import org.apache.maven.surefire.booter.Classpath;
@@ -166,7 +167,8 @@ public void processShouldExitWithoutSayingGoodBye() throws 
Exception {
                 true,
                 xmlReporter,
                 outputReporter,
-                statelessTestsetInfoReporter);
+                statelessTestsetInfoReporter,
+                new ReporterFactoryOptions());
 
         ConsoleLogger logger = mock(ConsoleLogger.class);
 
@@ -253,7 +255,8 @@ public void processShouldWaitForAck() throws Exception {
                 true,
                 xmlReporter,
                 outputReporter,
-                statelessTestsetInfoReporter);
+                statelessTestsetInfoReporter,
+                new ReporterFactoryOptions());
 
         ConsoleLogger logger = mock(ConsoleLogger.class);
 
diff --git 
a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/TestSetMockReporterFactory.java
 
b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/TestSetMockReporterFactory.java
index 8a419acec..fe7791ea6 100644
--- 
a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/TestSetMockReporterFactory.java
+++ 
b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/TestSetMockReporterFactory.java
@@ -26,6 +26,7 @@
 import 
org.apache.maven.plugin.surefire.extensions.SurefireStatelessTestsetInfoReporter;
 import org.apache.maven.plugin.surefire.log.api.NullConsoleLogger;
 import org.apache.maven.plugin.surefire.report.DefaultReporterFactory;
+import org.apache.maven.surefire.api.report.ReporterFactoryOptions;
 import org.apache.maven.surefire.api.report.TestOutputReportEntry;
 import org.apache.maven.surefire.api.report.TestReportListener;
 
@@ -70,6 +71,7 @@ private static StartupReportConfiguration defaultValue() {
                 true,
                 new SurefireStatelessReporter(),
                 new SurefireConsoleOutputReporter(),
-                new SurefireStatelessTestsetInfoReporter());
+                new SurefireStatelessTestsetInfoReporter(),
+                new ReporterFactoryOptions());
     }
 }
diff --git 
a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/E2ETest.java
 
b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/E2ETest.java
index 28ce11264..6de35f6ee 100644
--- 
a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/E2ETest.java
+++ 
b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/E2ETest.java
@@ -167,9 +167,9 @@ public void writeTestOutput(OutputReportEntry reportEntry) {
         // 1.0 seconds while using the encoder/decoder
         assertThat(readTime.get())
                 .describedAs("The performance test should assert 1.0 s of read 
time. "
-                        + "The limit 6 s guarantees that the read time does 
not exceed this limit on overloaded CPU.")
+                        + "The limit 10 s guarantees that the read time does 
not exceed this limit on overloaded CPU.")
                 .isPositive()
-                .isLessThanOrEqualTo(6_000L);
+                .isLessThanOrEqualTo(10_000L);
     }
 
     @Test(timeout = 10_000L)
diff --git 
a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/EventConsumerThreadTest.java
 
b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/EventConsumerThreadTest.java
index b10288612..38d9b7d11 100644
--- 
a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/EventConsumerThreadTest.java
+++ 
b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/EventConsumerThreadTest.java
@@ -32,6 +32,7 @@
 import org.apache.maven.surefire.api.fork.ForkNodeArguments;
 import org.apache.maven.surefire.extensions.EventHandler;
 import org.apache.maven.surefire.extensions.util.CountdownCloseable;
+import org.junit.Ignore;
 import org.junit.Test;
 
 import static java.lang.Math.min;
@@ -43,6 +44,7 @@
 /**
  *
  */
+@Ignore("This test doesn't make sense as this can be running on slow machine")
 public class EventConsumerThreadTest {
     @SuppressWarnings("checkstyle:magicnumber")
     @Test(timeout = 60_000L)
diff --git 
a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactoryTest.java
 
b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactoryTest.java
index 484d71798..86c23c82a 100644
--- 
a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactoryTest.java
+++ 
b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactoryTest.java
@@ -32,6 +32,7 @@
 import 
org.apache.maven.plugin.surefire.extensions.SurefireStatelessTestsetInfoReporter;
 import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
 import 
org.apache.maven.plugin.surefire.report.DefaultReporterFactory.TestResultType;
+import org.apache.maven.surefire.api.report.ReporterFactoryOptions;
 import org.apache.maven.surefire.api.report.SafeThrowable;
 import org.apache.maven.surefire.api.report.StackTraceWriter;
 import org.apache.maven.surefire.api.report.TestOutputReportEntry;
@@ -89,7 +90,8 @@ public void testMergeTestHistoryResult() throws Exception {
                 true,
                 new SurefireStatelessReporter(),
                 new SurefireConsoleOutputReporter(),
-                new SurefireStatelessTestsetInfoReporter());
+                new SurefireStatelessTestsetInfoReporter(),
+                new ReporterFactoryOptions());
 
         DummyTestReporter reporter = new DummyTestReporter();
 
@@ -294,7 +296,8 @@ public void testLogger() {
                 true,
                 new SurefireStatelessReporter(),
                 new SurefireConsoleOutputReporter(),
-                new SurefireStatelessTestsetInfoReporter());
+                new SurefireStatelessTestsetInfoReporter(),
+                new ReporterFactoryOptions());
 
         DummyTestReporter reporter = new DummyTestReporter();
 
@@ -360,7 +363,8 @@ public void testCreateReporterWithZeroStatistics() {
                 true,
                 new SurefireStatelessReporter(),
                 new SurefireConsoleOutputReporter(),
-                new SurefireStatelessTestsetInfoReporter());
+                new SurefireStatelessTestsetInfoReporter(),
+                new ReporterFactoryOptions());
 
         assertTrue(reportConfig.isUseFile());
         assertTrue(reportConfig.isPrintSummary());
diff --git a/maven-surefire-plugin/pom.xml b/maven-surefire-plugin/pom.xml
index 8663ac252..ed85e2879 100644
--- a/maven-surefire-plugin/pom.xml
+++ b/maven-surefire-plugin/pom.xml
@@ -136,30 +136,6 @@
   </reporting>
 
   <profiles>
-    <profile>
-      <id>ci</id>
-      <activation>
-        <property>
-          <name>enableCiProfile</name>
-          <value>true</value>
-        </property>
-      </activation>
-      <build>
-        <plugins>
-          <plugin>
-            <artifactId>maven-docck-plugin</artifactId>
-            <version>1.2</version>
-            <executions>
-              <execution>
-                <goals>
-                  <goal>check</goal>
-                </goals>
-              </execution>
-            </executions>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
     <profile>
       <id>reporting</id>
       <reporting>
diff --git a/maven-surefire-report-plugin/pom.xml 
b/maven-surefire-report-plugin/pom.xml
index 5234cfb98..51162935d 100644
--- a/maven-surefire-report-plugin/pom.xml
+++ b/maven-surefire-report-plugin/pom.xml
@@ -235,30 +235,6 @@
   </reporting>
 
   <profiles>
-    <profile>
-      <id>ci</id>
-      <activation>
-        <property>
-          <name>enableCiProfile</name>
-          <value>true</value>
-        </property>
-      </activation>
-      <build>
-        <plugins>
-          <plugin>
-            <artifactId>maven-docck-plugin</artifactId>
-            <version>1.2</version>
-            <executions>
-              <execution>
-                <goals>
-                  <goal>check</goal>
-                </goals>
-              </execution>
-            </executions>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
     <profile>
       <id>reporting</id>
       <reporting>
diff --git a/pom.xml b/pom.xml
index 20aedf047..9402b51af 100644
--- a/pom.xml
+++ b/pom.xml
@@ -217,7 +217,7 @@
       <dependency>
         <groupId>org.mockito</groupId>
         <artifactId>mockito-core</artifactId>
-        <version>2.28.2</version>
+        <version>3.12.4</version>
       </dependency>
       <!-- PowerMock@Java9 and Java11
       org.powermock for java9, see 
https://github.com/powermock/powermock/issues/783
diff --git 
a/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/ForkingReporterFactory.java
 
b/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/ForkingReporterFactory.java
index 01ce9fff6..d4dc5d05e 100644
--- 
a/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/ForkingReporterFactory.java
+++ 
b/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/ForkingReporterFactory.java
@@ -19,6 +19,7 @@
 package org.apache.maven.surefire.api.booter;
 
 import org.apache.maven.surefire.api.report.ReporterFactory;
+import org.apache.maven.surefire.api.report.TestOutputReportEntry;
 import org.apache.maven.surefire.api.report.TestReportListener;
 import org.apache.maven.surefire.api.suite.RunResult;
 
@@ -39,7 +40,7 @@ public ForkingReporterFactory(boolean trimstackTrace, 
MasterProcessChannelEncode
     }
 
     @Override
-    public TestReportListener createTestReportListener() {
+    public TestReportListener<TestOutputReportEntry> 
createTestReportListener() {
         return new ForkingRunListener(eventChannel, trimstackTrace);
     }
 
diff --git 
a/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ReporterFactoryOptions.java
 
b/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ReporterFactoryOptions.java
new file mode 100644
index 000000000..fcdac04bf
--- /dev/null
+++ 
b/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ReporterFactoryOptions.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.surefire.api.report;
+
+import org.apache.maven.surefire.api.util.ReflectionUtils;
+
+public class ReporterFactoryOptions {
+    /**
+     * provider such Junit5 may be running tests in parallel so report will 
stored depending on
+     * {@link ReportEntry#getSourceName()}
+     */
+    private boolean statPerSourceName;
+
+    public ReporterFactoryOptions() {}
+
+    public ReporterFactoryOptions(boolean statPerSourceName) {
+        this.statPerSourceName = statPerSourceName;
+    }
+
+    public boolean isStatPerSourceName() {
+        return statPerSourceName;
+    }
+
+    public void setStatPerSourceName(boolean statPerSourceName) {
+        this.statPerSourceName = statPerSourceName;
+    }
+
+    public Object clone(ClassLoader target) {
+        try {
+            Class<?> cls = ReflectionUtils.reloadClass(target, this);
+            Object clone = cls.newInstance();
+
+            cls.getMethod("setStatPerSourceName", boolean.class).invoke(clone, 
isStatPerSourceName());
+
+            return clone;
+        } catch (ReflectiveOperationException e) {
+            throw new IllegalStateException(e.getLocalizedMessage());
+        }
+    }
+}
diff --git 
a/surefire-api/src/test/java/org/apache/maven/surefire/api/util/internal/AsyncSocketTest.java
 
b/surefire-api/src/test/java/org/apache/maven/surefire/api/util/internal/AsyncSocketTest.java
index 40b98dcd2..920f067bb 100644
--- 
a/surefire-api/src/test/java/org/apache/maven/surefire/api/util/internal/AsyncSocketTest.java
+++ 
b/surefire-api/src/test/java/org/apache/maven/surefire/api/util/internal/AsyncSocketTest.java
@@ -41,6 +41,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 
+import org.junit.Ignore;
 import org.junit.Test;
 
 import static java.net.StandardSocketOptions.SO_KEEPALIVE;
@@ -54,6 +55,7 @@
  * Low level Java benchmark test.
  */
 @SuppressWarnings("checkstyle:magicnumber")
+@Ignore("Can be flaky on slow machine")
 public class AsyncSocketTest {
     private static final String LONG_STRING =
             
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789";
diff --git 
a/surefire-booter/src/test/java/org/apache/maven/surefire/booter/SurefireReflectorTest.java
 
b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/SurefireReflectorTest.java
index 25b73bae5..9e92e3619 100644
--- 
a/surefire-booter/src/test/java/org/apache/maven/surefire/booter/SurefireReflectorTest.java
+++ 
b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/SurefireReflectorTest.java
@@ -30,6 +30,7 @@
 import org.apache.maven.surefire.api.provider.SurefireProvider;
 import org.apache.maven.surefire.api.report.ReporterConfiguration;
 import org.apache.maven.surefire.api.report.ReporterFactory;
+import org.apache.maven.surefire.api.report.TestOutputReportEntry;
 import org.apache.maven.surefire.api.report.TestReportListener;
 import org.apache.maven.surefire.api.suite.RunResult;
 import org.apache.maven.surefire.api.testset.DirectoryScannerParameters;
@@ -50,7 +51,7 @@ public class SurefireReflectorTest extends TestCase {
     public void testShouldCreateFactoryWithoutException() {
         ReporterFactory factory = new ReporterFactory() {
             @Override
-            public TestReportListener createTestReportListener() {
+            public TestReportListener<TestOutputReportEntry> 
createTestReportListener() {
                 return null;
             }
 
@@ -226,7 +227,7 @@ public void testReporterFactory() {
 
         ReporterFactory reporterFactory = new ReporterFactory() {
             @Override
-            public TestReportListener createTestReportListener() {
+            public TestReportListener<TestOutputReportEntry> 
createTestReportListener() {
                 return null;
             }
 
@@ -246,7 +247,7 @@ public void testReporterFactoryAware() {
 
         ReporterFactory reporterFactory = new ReporterFactory() {
             @Override
-            public TestReportListener createTestReportListener() {
+            public TestReportListener<TestOutputReportEntry> 
createTestReportListener() {
                 return null;
             }
 
diff --git a/surefire-its/pom.xml b/surefire-its/pom.xml
index ffc745302..192506651 100644
--- a/surefire-its/pom.xml
+++ b/surefire-its/pom.xml
@@ -33,6 +33,8 @@
 
   <properties>
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    <its.forkCount>1C</its.forkCount>
+    <its.threadCount>1</its.threadCount>
   </properties>
 
   <dependencies>
@@ -193,14 +195,13 @@
         <plugins>
           <plugin>
             <artifactId>maven-failsafe-plugin</artifactId>
-            <version>3.5.0</version>
+            <version>3.5.2</version>
             <!-- ${shadedVersion}, but resolved due to 
https://issues.apache.org/jira/browse/MRELEASE-799 -->
             <configuration>
               <skipTests>${skipTests}</skipTests>
               <runOrder>alphabetical</runOrder>
-              <forkCount>1C</forkCount>
-              <threadCount>1</threadCount>
-              <forkCount>1C</forkCount>
+              <forkCount>${its.forkCount}</forkCount>
+              <threadCount>${its.threadCount}</threadCount>
               <rerunFailingTestsCount>1</rerunFailingTestsCount>
               <perCoreThreadCount>false</perCoreThreadCount>
               <argLine>-server -Xmx64m -XX:+UseG1GC -XX:+TieredCompilation 
-XX:TieredStopAtLevel=1 -Djava.awt.headless=true 
-Djdk.net.URLClassPath.disableClassPathURLCheck=true</argLine>
@@ -241,6 +242,13 @@
         </plugins>
       </build>
     </profile>
+    <profile>
+      <id>apache.ci</id>
+      <properties>
+        <its.forkCount>0.4C</its.forkCount>
+        <its.threadCount>1</its.threadCount>
+      </properties>
+    </profile>
     <profile>
       <id>github</id>
       <activation>
diff --git 
a/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1643IT.java
 
b/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1643IT.java
new file mode 100644
index 000000000..cacd1a793
--- /dev/null
+++ 
b/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1643IT.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.surefire.its.jiras;
+
+import org.apache.maven.surefire.its.fixture.OutputValidator;
+import org.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
+import org.apache.maven.surefire.its.fixture.TestFile;
+import org.junit.Test;
+
+/**
+ *
+ */
+@SuppressWarnings("checkstyle:magicnumber")
+public class Surefire1643IT extends SurefireJUnit4IntegrationTestCase {
+    @Test
+    public void shouldNotMixResults() {
+        OutputValidator outputValidator = 
unpack("surefire-1643-parallel-junit5")
+                .maven()
+                .withFailure()
+                .executeTest()
+                .verifyTextInLog("BUILD FAILURE")
+                .assertTestSuiteResults(15, 0, 4, 0);
+
+        TestFile xmlReportFile = 
outputValidator.getSurefireReportsXmlFile("TEST-io.olamy.App1Test.xml");
+        xmlReportFile
+                .assertNotContainsText("App2Test")
+                .assertNotContainsText("App3Test")
+                .assertNotContainsText("App4Test")
+                .assertNotContainsText("App5Test");
+
+        xmlReportFile = 
outputValidator.getSurefireReportsXmlFile("TEST-io.olamy.App2Test.xml");
+        xmlReportFile
+                .assertNotContainsText("App1Test")
+                .assertNotContainsText("App3Test")
+                .assertNotContainsText("App4Test")
+                .assertNotContainsText("App5Test");
+
+        xmlReportFile = 
outputValidator.getSurefireReportsXmlFile("TEST-io.olamy.App3Test.xml");
+        xmlReportFile
+                .assertNotContainsText("App1Test")
+                .assertNotContainsText("App2Test")
+                .assertNotContainsText("App4Test")
+                .assertNotContainsText("App5Test");
+
+        xmlReportFile = 
outputValidator.getSurefireReportsXmlFile("TEST-io.olamy.App4Test.xml");
+        xmlReportFile
+                .assertNotContainsText("App1Test")
+                .assertNotContainsText("App2Test")
+                .assertNotContainsText("App3Test")
+                .assertNotContainsText("App5Test");
+
+        xmlReportFile = 
outputValidator.getSurefireReportsXmlFile("TEST-io.olamy.App5Test.xml");
+        xmlReportFile
+                .assertNotContainsText("App1Test")
+                .assertNotContainsText("App2Test")
+                .assertNotContainsText("App3Test")
+                .assertNotContainsText("App4Test");
+    }
+}
diff --git 
a/surefire-its/src/test/resources/surefire-1144-xml-runtime/src/test/java/surefire1144/Test1.java
 
b/surefire-its/src/test/resources/surefire-1144-xml-runtime/src/test/java/surefire1144/Test1.java
index 3cedf8fe9..236fe8f16 100644
--- 
a/surefire-its/src/test/resources/surefire-1144-xml-runtime/src/test/java/surefire1144/Test1.java
+++ 
b/surefire-its/src/test/resources/surefire-1144-xml-runtime/src/test/java/surefire1144/Test1.java
@@ -4,18 +4,15 @@
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import java.util.concurrent.TimeUnit;
+
 public class Test1
 {
     static void sleep( int ms )
     {
-        long target = System.currentTimeMillis() + ms;
         try
         {
-            do
-            {
-                Thread.sleep( 1L );
-            }
-            while ( System.currentTimeMillis() < target );
+            TimeUnit.MILLISECONDS.sleep((long)ms);
         }
         catch ( InterruptedException e )
         {
@@ -27,24 +24,25 @@ static void printTimeAndSleep( String msg, int ms )
     {
         System.out.println( msg + " started @ " + System.currentTimeMillis() );
         sleep( ms );
+        System.out.println( msg + " finished @ " + System.currentTimeMillis() 
);
     }
 
     @Test
     public void testSleep100()
     {
-        printTimeAndSleep( "Test1.sleep100", 100 );
+        printTimeAndSleep( "Test1.sleep:100", 100 );
     }
 
     @Test
     public void testSleep200()
     {
-        printTimeAndSleep( "Test1.sleep200", 200 );
+        printTimeAndSleep( "Test1.sleep:200", 200 );
     }
 
     @Test
     public void testSleep300()
     {
-        printTimeAndSleep( "Test1.sleep300", 300 );
+        printTimeAndSleep( "Test1.sleep:300", 300 );
     }
 
     @BeforeClass
diff --git 
a/surefire-its/src/test/resources/surefire-1643-parallel-junit5/.mvn/jvm.config 
b/surefire-its/src/test/resources/surefire-1643-parallel-junit5/.mvn/jvm.config
new file mode 100644
index 000000000..e69de29bb
diff --git 
a/surefire-its/src/test/resources/surefire-1643-parallel-junit5/.mvn/maven.config
 
b/surefire-its/src/test/resources/surefire-1643-parallel-junit5/.mvn/maven.config
new file mode 100644
index 000000000..e69de29bb
diff --git 
a/surefire-its/src/test/resources/surefire-1643-parallel-junit5/pom.xml 
b/surefire-its/src/test/resources/surefire-1643-parallel-junit5/pom.xml
new file mode 100644
index 000000000..247569be6
--- /dev/null
+++ b/surefire-its/src/test/resources/surefire-1643-parallel-junit5/pom.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.maven.plugins.surefire</groupId>
+  <artifactId>junit-platform-1.0.0</artifactId>
+  <version>1.0</version>
+  <name>[SUREFIRE-1643] JUnit 5: Parallel Test mixed</name>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <maven.compiler.source>1.8</maven.compiler.source>
+    <maven.compiler.target>1.8</maven.compiler.target>
+    
<junit.jupiter.execution.parallel.config.fixed.parallelism>3</junit.jupiter.execution.parallel.config.fixed.parallelism>
+    
<junit.jupiter.execution.parallel.config.strategy>fixed</junit.jupiter.execution.parallel.config.strategy>
+    
<junit.jupiter.execution.parallel.enabled>true</junit.jupiter.execution.parallel.enabled>
+    
<junit.jupiter.execution.parallel.mode.classes.default>concurrent</junit.jupiter.execution.parallel.mode.classes.default>
+    
<junit.jupiter.execution.parallel.mode.default>same_thread</junit.jupiter.execution.parallel.mode.default>
+  </properties>
+
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.junit</groupId>
+        <artifactId>junit-bom</artifactId>
+        <version>5.9.1</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter-api</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <pluginManagement><!-- lock down plugins versions to avoid using Maven 
defaults (may be moved to parent pom) -->
+      <plugins>
+        <!-- clean lifecycle, see 
https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle 
-->
+        <plugin>
+          <artifactId>maven-clean-plugin</artifactId>
+          <version>3.4.0</version>
+        </plugin>
+        <!-- default lifecycle, jar packaging: see 
https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging
 -->
+        <plugin>
+          <artifactId>maven-resources-plugin</artifactId>
+          <version>3.3.1</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <version>3.13.0</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-surefire-plugin</artifactId>
+          <version>${surefire.version}</version>
+          <configuration>
+<!--            <forkNode 
implementation="org.apache.maven.plugin.surefire.extensions.SurefireForkNodeFactory"
 />-->
+            <trimStackTrace>false</trimStackTrace>
+            <rerunFailingTestsCount>1</rerunFailingTestsCount>
+            <forkedProcessTimeoutInSeconds>3600</forkedProcessTimeoutInSeconds>
+            <runOrder>alphabetical</runOrder>
+            <properties>
+              
<configurationParameters>junit.jupiter.execution.parallel.enabled=${junit.jupiter.execution.parallel.enabled}
+                
junit.jupiter.execution.parallel.mode.default=${junit.jupiter.execution.parallel.mode.default}
+                
junit.jupiter.execution.parallel.mode.classes.default=${junit.jupiter.execution.parallel.mode.classes.default}
+                
junit.jupiter.execution.parallel.config.strategy=${junit.jupiter.execution.parallel.config.strategy}
+                
junit.jupiter.execution.parallel.config.fixed.parallelism=${junit.jupiter.execution.parallel.config.fixed.parallelism}</configurationParameters>
+            </properties>
+            <statelessTestsetReporter 
implementation="org.apache.maven.plugin.surefire.extensions.junit5.JUnit5Xml30StatelessReporter">
+              <disable>false</disable>
+              <usePhrasedFileName>false</usePhrasedFileName>
+              <usePhrasedTestSuiteClassName>true</usePhrasedTestSuiteClassName>
+              <usePhrasedTestCaseClassName>true</usePhrasedTestCaseClassName>
+              <usePhrasedTestCaseMethodName>true</usePhrasedTestCaseMethodName>
+            </statelessTestsetReporter>
+            <consoleOutputReporter 
implementation="org.apache.maven.plugin.surefire.extensions.junit5.JUnit5ConsoleOutputReporter">
+              <disable>false</disable>
+              <encoding>UTF-8</encoding>
+              <usePhrasedFileName>false</usePhrasedFileName>
+            </consoleOutputReporter>
+            <statelessTestsetInfoReporter 
implementation="org.apache.maven.plugin.surefire.extensions.junit5.JUnit5StatelessTestsetInfoReporter">
+              <disable>false</disable>
+              <usePhrasedFileName>false</usePhrasedFileName>
+              <usePhrasedClassNameInRunning>true</usePhrasedClassNameInRunning>
+              
<usePhrasedClassNameInTestCaseSummary>true</usePhrasedClassNameInTestCaseSummary>
+            </statelessTestsetInfoReporter>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
+</project>
diff --git 
a/surefire-its/src/test/resources/surefire-1643-parallel-junit5/src/main/java/io/olamy/App.java
 
b/surefire-its/src/test/resources/surefire-1643-parallel-junit5/src/main/java/io/olamy/App.java
new file mode 100644
index 000000000..5354cd8a6
--- /dev/null
+++ 
b/surefire-its/src/test/resources/surefire-1643-parallel-junit5/src/main/java/io/olamy/App.java
@@ -0,0 +1,10 @@
+package io.olamy;
+
+/**
+ * Hello world!
+ */
+public class App {
+    public static void main(String[] args) {
+        System.out.println("Hello World!");
+    }
+}
diff --git 
a/surefire-its/src/test/resources/surefire-1643-parallel-junit5/src/test/java/io/olamy/App1Test.java
 
b/surefire-its/src/test/resources/surefire-1643-parallel-junit5/src/test/java/io/olamy/App1Test.java
new file mode 100644
index 000000000..290400446
--- /dev/null
+++ 
b/surefire-its/src/test/resources/surefire-1643-parallel-junit5/src/test/java/io/olamy/App1Test.java
@@ -0,0 +1,30 @@
+package io.olamy;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * Unit test for simple App.
+ */
+public class App1Test {
+
+    @Test
+    public void app1One() throws Throwable {
+        Thread.sleep(2000);
+        assertTrue(true);
+    }
+
+    @Test
+    public void app1Two() throws Throwable {
+        Thread.sleep(2000);
+        assertTrue(true);
+    }
+
+    @Test
+    public void app1Three() throws Throwable {
+        Thread.sleep(2000);
+        assertTrue(false);
+    }
+
+}
diff --git 
a/surefire-its/src/test/resources/surefire-1643-parallel-junit5/src/test/java/io/olamy/App2Test.java
 
b/surefire-its/src/test/resources/surefire-1643-parallel-junit5/src/test/java/io/olamy/App2Test.java
new file mode 100644
index 000000000..65d916540
--- /dev/null
+++ 
b/surefire-its/src/test/resources/surefire-1643-parallel-junit5/src/test/java/io/olamy/App2Test.java
@@ -0,0 +1,30 @@
+package io.olamy;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * Unit test for simple App.
+ */
+public class App2Test {
+
+    @Test
+    public void app2One() throws Throwable {
+        Thread.sleep(3000);
+        assertTrue(true);
+    }
+
+    @Test
+    public void app2Two() throws Throwable {
+        Thread.sleep(1000);
+        assertTrue(true);
+    }
+
+    @Test
+    public void app2Three() throws Throwable {
+        Thread.sleep(2000);
+        assertTrue(true);
+    }
+
+}
diff --git 
a/surefire-its/src/test/resources/surefire-1643-parallel-junit5/src/test/java/io/olamy/App3Test.java
 
b/surefire-its/src/test/resources/surefire-1643-parallel-junit5/src/test/java/io/olamy/App3Test.java
new file mode 100644
index 000000000..3835e479c
--- /dev/null
+++ 
b/surefire-its/src/test/resources/surefire-1643-parallel-junit5/src/test/java/io/olamy/App3Test.java
@@ -0,0 +1,30 @@
+package io.olamy;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * Unit test for simple App.
+ */
+public class App3Test {
+
+    @Test
+    public void app3One() throws Throwable {
+        Thread.sleep(500);
+        assertTrue(true);
+    }
+
+    @Test
+    public void app3Two() throws Throwable {
+        Thread.sleep(7000);
+        assertTrue(false);
+    }
+
+    @Test
+    public void app3Three() throws Throwable {
+        Thread.sleep(1000);
+        assertTrue(false);
+    }
+
+}
diff --git 
a/surefire-its/src/test/resources/surefire-1643-parallel-junit5/src/test/java/io/olamy/App4Test.java
 
b/surefire-its/src/test/resources/surefire-1643-parallel-junit5/src/test/java/io/olamy/App4Test.java
new file mode 100644
index 000000000..a4831a1c0
--- /dev/null
+++ 
b/surefire-its/src/test/resources/surefire-1643-parallel-junit5/src/test/java/io/olamy/App4Test.java
@@ -0,0 +1,30 @@
+package io.olamy;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * Unit test for simple App.
+ */
+public class App4Test {
+
+    @Test
+    public void app4One() throws Throwable {
+        Thread.sleep(500);
+        assertTrue(true);
+    }
+
+    @Test
+    public void app4Two() throws Throwable {
+        Thread.sleep(7000);
+        assertTrue(true);
+    }
+
+    @Test
+    public void app4Three() throws Throwable {
+        Thread.sleep(1000);
+        assertTrue(true);
+    }
+
+}
diff --git 
a/surefire-its/src/test/resources/surefire-1643-parallel-junit5/src/test/java/io/olamy/App5Test.java
 
b/surefire-its/src/test/resources/surefire-1643-parallel-junit5/src/test/java/io/olamy/App5Test.java
new file mode 100644
index 000000000..7ff884e95
--- /dev/null
+++ 
b/surefire-its/src/test/resources/surefire-1643-parallel-junit5/src/test/java/io/olamy/App5Test.java
@@ -0,0 +1,30 @@
+package io.olamy;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * Unit test for simple App.
+ */
+public class App5Test {
+
+    @Test
+    public void app5One() throws Throwable {
+        Thread.sleep(500);
+        assertTrue(true);
+    }
+
+    @Test
+    public void app5Two() throws Throwable {
+        Thread.sleep(200);
+        assertTrue(false);
+    }
+
+    @Test
+    public void app5Three() throws Throwable {
+        Thread.sleep(1000);
+        assertTrue(true);
+    }
+
+}
diff --git 
a/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProvider.java
 
b/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProvider.java
index 5e8255490..416c38a38 100644
--- 
a/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProvider.java
+++ 
b/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProvider.java
@@ -46,6 +46,7 @@
 import org.junit.platform.launcher.Launcher;
 import org.junit.platform.launcher.LauncherDiscoveryRequest;
 import org.junit.platform.launcher.TagFilter;
+import org.junit.platform.launcher.TestExecutionListener;
 import org.junit.platform.launcher.TestIdentifier;
 import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder;
 
@@ -112,6 +113,7 @@ public RunResult invoke(Object forkTestSet) throws 
TestSetFailedException, Repor
         try {
             RunListenerAdapter adapter = new 
RunListenerAdapter(reporterFactory.createTestReportListener());
             adapter.setRunMode(NORMAL_RUN);
+
             startCapture(adapter);
             setupJunitLogger();
             if (forkTestSet instanceof TestsToRun) {
@@ -172,6 +174,15 @@ private void invokeAllTests(TestsToRun testsToRun, 
RunListenerAdapter adapter) {
     }
 
     private void execute(TestsToRun testsToRun, RunListenerAdapter adapter) {
+        // parameters.getProviderProperties().get(CONFIGURATION_PARAMETERS)
+        // add this LegacyXmlReportGeneratingListener ?
+        //            adapter,
+        //            new LegacyXmlReportGeneratingListener(
+        //                    new File("target", "junit-platform").toPath(), 
new PrintWriter(System.out))
+        //        };
+
+        TestExecutionListener[] testExecutionListeners = new 
TestExecutionListener[] {adapter};
+
         if (testsToRun.allowEagerReading()) {
             List<DiscoverySelector> selectors = new ArrayList<>();
             testsToRun.iterator().forEachRemaining(c -> 
selectors.add(selectClass(c.getName())));
@@ -180,15 +191,14 @@ private void execute(TestsToRun testsToRun, 
RunListenerAdapter adapter) {
                     .filters(filters)
                     .configurationParameters(configurationParameters)
                     .selectors(selectors);
-
-            launcher.execute(builder.build(), adapter);
+            launcher.execute(builder.build(), testExecutionListeners);
         } else {
             testsToRun.iterator().forEachRemaining(c -> {
                 LauncherDiscoveryRequestBuilder builder = request()
                         .filters(filters)
                         .configurationParameters(configurationParameters)
                         .selectors(selectClass(c.getName()));
-                launcher.execute(builder.build(), adapter);
+                launcher.execute(builder.build(), testExecutionListeners);
             });
         }
     }
@@ -237,7 +247,7 @@ private Filter<?>[] newFilters() {
                 .map(EngineFilter::excludeEngines)
                 .ifPresent(filters::add);
 
-        return filters.toArray(new Filter<?>[filters.size()]);
+        return filters.toArray(new Filter<?>[0]);
     }
 
     Filter<?>[] getFilters() {
diff --git 
a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/JUnitCoreTester.java
 
b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/JUnitCoreTester.java
index 156cc5ea9..1a4f74c29 100644
--- 
a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/JUnitCoreTester.java
+++ 
b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/JUnitCoreTester.java
@@ -30,6 +30,7 @@
 import org.apache.maven.plugin.surefire.log.api.NullConsoleLogger;
 import org.apache.maven.plugin.surefire.report.DefaultReporterFactory;
 import org.apache.maven.surefire.api.report.ReporterFactory;
+import org.apache.maven.surefire.api.report.ReporterFactoryOptions;
 import org.apache.maven.surefire.api.testset.TestSetFailedException;
 import org.junit.runner.Computer;
 import org.junit.runner.JUnitCore;
@@ -113,6 +114,7 @@ private static StartupReportConfiguration 
defaultStartupReportConfiguration() {
                 true,
                 new SurefireStatelessReporter(),
                 new SurefireConsoleOutputReporter(),
-                new SurefireStatelessTestsetInfoReporter());
+                new SurefireStatelessTestsetInfoReporter(),
+                new ReporterFactoryOptions());
     }
 }

Reply via email to