You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ti...@apache.org on 2019/02/16 11:38:55 UTC

[maven-surefire] branch SUREFIRE-1585-tibor2 updated (afdc189 -> 36f777c)

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

tibordigana pushed a change to branch SUREFIRE-1585-tibor2
in repository https://gitbox.apache.org/repos/asf/maven-surefire.git.


    from afdc189  [SUREFIRE-1585] Align JUnit Platform version at runtime
     new f33943f  [SUREFIRE-1585] Align JUnit Platform version at runtime
     new 36f777c  [SUREFIRE-1585] Align JUnit Platform version at runtime

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../plugin/surefire/AbstractSurefireMojo.java      |  66 +--
 .../plugin/surefire/AbstractSurefireMojoTest.java  | 454 +++++++++++++++++++++
 2 files changed, 491 insertions(+), 29 deletions(-)


[maven-surefire] 02/02: [SUREFIRE-1585] Align JUnit Platform version at runtime

Posted by ti...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

tibordigana pushed a commit to branch SUREFIRE-1585-tibor2
in repository https://gitbox.apache.org/repos/asf/maven-surefire.git

commit 36f777ca1a66a07f1dc2c1ae799f32bd3f969e62
Author: tibordigana <ti...@apache.org>
AuthorDate: Sat Feb 16 12:38:45 2019 +0100

    [SUREFIRE-1585] Align JUnit Platform version at runtime
---
 .../plugin/surefire/AbstractSurefireMojo.java      | 14 ++--
 .../plugin/surefire/AbstractSurefireMojoTest.java  | 87 ++++++++++++----------
 2 files changed, 54 insertions(+), 47 deletions(-)

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 90fc075..7ae7d0f 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
@@ -480,12 +480,13 @@ public abstract class AbstractSurefireMojo
     private String junitArtifactName;
 
     /**
-     * Allows you to specify the name of the JUnit Platform artifact.
-     * If not set, {@code org.junit.platform:junit-platform-engine} will be used.
+     * Allows you to select the name of JUnit5 engine.<br>
+     * If not set, all engines on classpath are used. In normal circumstances the provider is able to
+     * work with multiple engines and no selection is needed to make.
      *
      * @since 2.22.0
      */
-    @Parameter( property = "junitPlatformArtifactName", defaultValue = "org.junit.platform:junit-platform-engine" )
+    @Parameter( property = "junitPlatformArtifactName", defaultValue = "org.junit.platform:junit-platform-commons" )
     private String junitPlatformArtifactName;
 
     /**
@@ -2677,7 +2678,7 @@ public abstract class AbstractSurefireMojo
                                                             + "is picking up an old junit version" );
                     }
                     throw new MojoFailureException( "groups/excludedGroups require TestNG, JUnit48+ or JUnit 5 "
-                            + "on project test classpath" );
+                            + "(a specific engine required on classpath) on project test classpath" );
                 }
             }
 
@@ -2917,7 +2918,6 @@ public abstract class AbstractSurefireMojo
             Map<String, Artifact> providerArtifacts =
                     dependencyResolver.getProviderClasspathAsMap( "surefire-junit-platform", surefireVersion );
             Map<String, Artifact> testDependencies = testClasspath.getTestDependencies();
-            // pozri hore ten parameter pre junit-platform-engine premenuj hodnotu na junit-platform-commons
             if ( hasDependencyPlatformEngine( testDependencies ) )
             {
                 String filterTestDependency = "org.junit.platform:junit-platform-engine";
@@ -2939,10 +2939,6 @@ public abstract class AbstractSurefireMojo
                 addEngineByApi( api, engineGroupId, engineArtifactId, providerArtifacts, testDependencies );
                 alignVersions( version, providerArtifacts, testDependencies );
             }
-            /*else if ( hasDependencyJUnit4( testDependencies ) )
-            {
-                addEngineByApi( "junit:junit", "junit", "junit", providerArtifacts, testDependencies );
-            }*/
             return new LinkedHashSet<>( providerArtifacts.values() );
         }
 
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java
index 016eef8..6e7f6c7 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java
@@ -36,7 +36,6 @@ import org.apache.maven.surefire.booter.Classpath;
 import org.apache.maven.surefire.booter.StartupConfiguration;
 import org.apache.maven.surefire.suite.RunResult;
 import org.codehaus.plexus.logging.Logger;
-import org.fest.assertions.MapAssert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -500,11 +499,9 @@ public class AbstractSurefireMojoTest
                 .containsOnly( expectedProvider, expectedCommonJava5, expectedLauncher, expectedApiguardian,
                         expectedJUnit5Engine, expectedOpentest4j, expectedPlatformCommons );
 
-        Artifact expectedJUnit = new DefaultArtifact( "junit", "junit",
-                createFromVersion( "4.12" ), null, "jar", null, mock( ArtifactHandler.class ) );
         assertThat( testClasspathWrapper.getTestDependencies() )
                 .hasSize( 1 )
-                .includes( entry( "junit:junit", expectedJUnit ) );
+                .includes( entry( "junit:junit", testClasspathJUnit ) );
     }
 
     @Test
@@ -513,16 +510,16 @@ public class AbstractSurefireMojoTest
         final VersionRange surefireVersion = createFromVersion( "1" );
 
         Artifact junitPlatformArtifact = new DefaultArtifact( "org.apache.maven.surefire",
-                "surefire-junit-platform", surefireVersion, null, "jar", "", mock( ArtifactHandler.class ) );
+                "surefire-junit-platform", surefireVersion, null, "jar", null, mock( ArtifactHandler.class ) );
 
         final Artifact testClasspathSomeTestArtifact = new DefaultArtifact( "third.party", "artifact",
-                createFromVersion( "1.0" ), null, "jar", "", null );
-
-        final Artifact testClasspathApiguardian = new DefaultArtifact( "org.apiguardian", "apiguardian-api",
-                createFromVersion( "1.0.0" ), null, "jar", "", null );
+                createFromVersion( "1.0" ), null, "jar", null, mock( ArtifactHandler.class ) );
 
         final Artifact testClasspathCommons = new DefaultArtifact( "org.junit.platform", "junit-platform-commons",
-                createFromVersion( "1.4.0" ), null, "jar", "", mock( ArtifactHandler.class ) );
+                createFromVersion( "1.4.0" ), null, "jar", null, mock( ArtifactHandler.class ) );
+
+        final Artifact testClasspathApiguardian = new DefaultArtifact( "org.apiguardian", "apiguardian-api",
+                createFromVersion( "1.0.0" ), null, "jar", null, mock( ArtifactHandler.class ) );
 
         Iterable<Artifact> testArtifacts =
                 asList( testClasspathSomeTestArtifact, testClasspathApiguardian, testClasspathCommons );
@@ -535,14 +532,14 @@ public class AbstractSurefireMojoTest
                 new TestClassPath( testArtifacts, classesDirectory, testClassesDirectory, null );
 
         Artifact forkedBooter = new DefaultArtifact( "org.apache.maven.surefire",
-                "surefire-booter", surefireVersion, null, "jar", "", null );
+                "surefire-booter", surefireVersion, null, "jar", null, mock( ArtifactHandler.class ) );
 
         mojo.setPluginArtifactMap( singletonMap( "org.apache.maven.surefire:surefire-booter", forkedBooter ) );
         mojo.setRemoteRepositories( Collections.<ArtifactRepository>emptyList() );
         mojo.setProjectRemoteRepositories( Collections.<ArtifactRepository>emptyList() );
         RepositorySystem repositorySystem = mock( RepositorySystem.class );
         final Artifact surefireProvider = new DefaultArtifact( "org.apache.maven.surefire",
-                "surefire-junit-platform", surefireVersion, null, "jar", "", null );
+                "surefire-junit-platform", surefireVersion, null, "jar", null, mock( ArtifactHandler.class ) );
         when( repositorySystem.createDependencyArtifact( any( Dependency.class ) ) ).thenAnswer( new Answer<Artifact>()
         {
             @Override
@@ -594,16 +591,22 @@ public class AbstractSurefireMojoTest
         Set<Artifact> resolvedProviderArtifacts = prov.getProviderClasspath();
 
         Artifact java5 = new DefaultArtifact( "org.apache.maven.surefire", "common-java5",
-                surefireVersion, null, "jar", "", null );
+                surefireVersion, null, "jar", null, mock( ArtifactHandler.class ) );
         Artifact launcher = new DefaultArtifact( "org.junit.platform", "junit-platform-launcher",
-                createFromVersion( "1.4.0" ), null, "jar", "", null );
+                createFromVersion( "1.4.0" ), null, "jar", null, mock( ArtifactHandler.class ) );
         Artifact testClasspathJUnit5 = new DefaultArtifact( "org.junit.platform", "junit-platform-engine",
-                createFromVersion( "1.4.0" ), null, "jar", "", null );
+                createFromVersion( "1.4.0" ), null, "jar", null, mock( ArtifactHandler.class ) );
         Artifact testClasspathOpentest4j = new DefaultArtifact( "org.opentest4j", "opentest4j",
-                createFromVersion( "1.1.1" ), null, "jar", "", null );
+                createFromVersion( "1.1.1" ), null, "jar", null, mock( ArtifactHandler.class ) );
         assertThat( resolvedProviderArtifacts )
                 .hasSize( 5 )
                 .containsOnly( surefireProvider, java5, launcher, testClasspathJUnit5, testClasspathOpentest4j );
+
+        assertThat( testClasspathWrapper.getTestDependencies() )
+                .hasSize( 3 )
+                .includes( entry( "third.party:artifact", testClasspathSomeTestArtifact ),
+                        entry( "org.junit.platform:junit-platform-commons", testClasspathCommons ),
+                        entry( "org.apiguardian:apiguardian-api", testClasspathApiguardian ) );
     }
 
     @Test
@@ -612,22 +615,22 @@ public class AbstractSurefireMojoTest
         final VersionRange surefireVersion = createFromVersion( "1" );
 
         Artifact junitPlatformArtifact = new DefaultArtifact( "org.apache.maven.surefire",
-                "surefire-junit-platform", surefireVersion, null, "jar", "", mock( ArtifactHandler.class ) );
+                "surefire-junit-platform", surefireVersion, null, "jar", null, mock( ArtifactHandler.class ) );
 
         final Artifact testClasspathSomeTestArtifact = new DefaultArtifact( "third.party", "artifact",
-                createFromVersion( "1.0" ), null, "jar", "", null );
+                createFromVersion( "1.0" ), null, "jar", null, mock( ArtifactHandler.class ) );
 
         final Artifact testClasspathJUnit5 = new DefaultArtifact( "org.junit.platform", "junit-platform-engine",
-                createFromVersion( "1.4.0" ), null, "jar", "", null );
+                createFromVersion( "1.4.0" ), null, "jar", null, mock( ArtifactHandler.class ) );
 
         final Artifact testClasspathApiguardian = new DefaultArtifact( "org.apiguardian", "apiguardian-api",
-                createFromVersion( "1.0.0" ), null, "jar", "", null );
+                createFromVersion( "1.0.0" ), null, "jar", null, mock( ArtifactHandler.class ) );
 
         final Artifact testClasspathCommons = new DefaultArtifact( "org.junit.platform", "junit-platform-commons",
-                createFromVersion( "1.4.0" ), null, "jar", "", mock( ArtifactHandler.class ) );
+                createFromVersion( "1.4.0" ), null, "jar", null, mock( ArtifactHandler.class ) );
 
         final Artifact testClasspathOpentest4j = new DefaultArtifact( "org.opentest4j", "opentest4j",
-                createFromVersion( "1.1.1" ), null, "jar", "", null );
+                createFromVersion( "1.1.1" ), null, "jar", null, mock( ArtifactHandler.class ) );
 
         Iterable<Artifact> testArtifacts = asList( testClasspathSomeTestArtifact, testClasspathJUnit5,
                 testClasspathApiguardian, testClasspathCommons, testClasspathOpentest4j );
@@ -640,14 +643,14 @@ public class AbstractSurefireMojoTest
                 new TestClassPath( testArtifacts, classesDirectory, testClassesDirectory, null );
 
         Artifact forkedBooter = new DefaultArtifact( "org.apache.maven.surefire",
-                "surefire-booter", surefireVersion, null, "jar", "", null );
+                "surefire-booter", surefireVersion, null, "jar", null, mock( ArtifactHandler.class ) );
 
         mojo.setPluginArtifactMap( singletonMap( "org.apache.maven.surefire:surefire-booter", forkedBooter ) );
         mojo.setRemoteRepositories( Collections.<ArtifactRepository>emptyList() );
         mojo.setProjectRemoteRepositories( Collections.<ArtifactRepository>emptyList() );
         RepositorySystem repositorySystem = mock( RepositorySystem.class );
         final Artifact surefireProvider = new DefaultArtifact( "org.apache.maven.surefire",
-                "surefire-junit-platform", surefireVersion, null, "jar", "", null );
+                "surefire-junit-platform", surefireVersion, null, "jar", null, mock( ArtifactHandler.class ) );
         when( repositorySystem.createDependencyArtifact( any( Dependency.class ) ) ).thenAnswer( new Answer<Artifact>()
         {
             @Override
@@ -701,12 +704,20 @@ public class AbstractSurefireMojoTest
         Set<Artifact> resolvedProviderArtifacts = prov.getProviderClasspath();
 
         Artifact java5 = new DefaultArtifact( "org.apache.maven.surefire", "common-java5",
-                surefireVersion, null, "jar", "", null );
+                surefireVersion, null, "jar", null, mock( ArtifactHandler.class ) );
         Artifact launcher = new DefaultArtifact( "org.junit.platform", "junit-platform-launcher",
-                createFromVersion( "1.4.0" ), null, "jar", "", null );
+                createFromVersion( "1.4.0" ), null, "jar", null, mock( ArtifactHandler.class ) );
         assertThat( resolvedProviderArtifacts )
                 .hasSize( 3 )
                 .containsOnly( surefireProvider, java5, launcher );
+
+        assertThat( testClasspathWrapper.getTestDependencies() )
+                .hasSize( 5 )
+                .includes( entry( "third.party:artifact", testClasspathSomeTestArtifact ),
+                        entry( "org.junit.platform:junit-platform-engine", testClasspathJUnit5 ),
+                        entry( "org.apiguardian:apiguardian-api", testClasspathApiguardian ),
+                        entry( "org.junit.platform:junit-platform-commons", testClasspathCommons ),
+                        entry( "org.opentest4j:opentest4j", testClasspathOpentest4j ) );
     }
 
     private static ArtifactResolutionResult createJUnitPlatformLauncherResolutionResult(
@@ -715,7 +726,7 @@ public class AbstractSurefireMojoTest
         ArtifactResolutionResult launcherResolutionResult = mock( ArtifactResolutionResult.class );
         Set<Artifact> resolvedLauncherArtifacts = new HashSet<>();
         Artifact launcher = new DefaultArtifact( "org.junit.platform", "junit-platform-launcher",
-                commons.getVersionRange(), null, "jar", "", null );
+                commons.getVersionRange(), null, "jar", null, mock( ArtifactHandler.class ) );
         resolvedLauncherArtifacts.add( launcher );
         resolvedLauncherArtifacts.add( apiguardian );
         resolvedLauncherArtifacts.add( junit5Engine );
@@ -730,13 +741,13 @@ public class AbstractSurefireMojoTest
     private static ArtifactResolutionResult createExpectedJUnitPlatformLauncherResolutionResult()
     {
         Artifact engine = new DefaultArtifact( "org.junit.platform", "junit-platform-engine",
-                createFromVersion( "1.4.0" ), null, "jar", "", mock( ArtifactHandler.class ) );
+                createFromVersion( "1.4.0" ), null, "jar", null, mock( ArtifactHandler.class ) );
         Artifact commons = new DefaultArtifact( "org.junit.platform", "junit-platform-commons",
-                createFromVersion( "1.4.0" ), null, "jar", "", mock( ArtifactHandler.class ) );
+                createFromVersion( "1.4.0" ), null, "jar", null, mock( ArtifactHandler.class ) );
         Artifact apiguardian = new DefaultArtifact( "org.apiguardian", "apiguardian-api",
-                createFromVersion( "1.0.0" ), null, "jar", "", null );
+                createFromVersion( "1.0.0" ), null, "jar", null, mock( ArtifactHandler.class ) );
         Artifact opentest4j = new DefaultArtifact( "org.opentest4j", "opentest4j",
-                createFromVersion( "1.1.1" ), null, "jar", "", mock( ArtifactHandler.class ) );
+                createFromVersion( "1.1.1" ), null, "jar", null, mock( ArtifactHandler.class ) );
         return createJUnitPlatformLauncherResolutionResult( engine, apiguardian, commons, opentest4j );
     }
 
@@ -762,19 +773,19 @@ public class AbstractSurefireMojoTest
         ArtifactResolutionResult surefirePlatformResolutionResult = mock( ArtifactResolutionResult.class );
 
         Artifact provider = new DefaultArtifact( "org.apache.maven.surefire", "surefire-junit-platform",
-                surefireVersion, null, "jar", "", null );
+                surefireVersion, null, "jar", null, mock( ArtifactHandler.class ) );
         Artifact java5 = new DefaultArtifact( "org.apache.maven.surefire", "common-java5",
-                surefireVersion, null, "jar", "", null );
+                surefireVersion, null, "jar", null, mock( ArtifactHandler.class ) );
         Artifact launcher = new DefaultArtifact( "org.junit.platform", "junit-platform-launcher",
-                createFromVersion( "1.3.2" ), null, "jar", "", null );
+                createFromVersion( "1.3.2" ), null, "jar", null, mock( ArtifactHandler.class ) );
         Artifact apiguardian = new DefaultArtifact( "org.apiguardian", "apiguardian-api",
-                createFromVersion( "1.0.0" ), null, "jar", "", null );
+                createFromVersion( "1.0.0" ), null, "jar", null, mock( ArtifactHandler.class ) );
         Artifact engine = new DefaultArtifact( "org.junit.platform", "junit-platform-engine",
-                createFromVersion( "1.3.2" ), null, "jar", "", null );
+                createFromVersion( "1.3.2" ), null, "jar", null, mock( ArtifactHandler.class ) );
         Artifact commons = new DefaultArtifact( "org.junit.platform", "junit-platform-commons",
-                createFromVersion( "1.3.2" ), null, "jar", "", null );
+                createFromVersion( "1.3.2" ), null, "jar", null, mock( ArtifactHandler.class ) );
         Artifact opentest4j = new DefaultArtifact( "org.opentest4j", "opentest4j",
-                createFromVersion( "1.1.1" ), null, "jar", "", null );
+                createFromVersion( "1.1.1" ), null, "jar", null, mock( ArtifactHandler.class ) );
 
         Set<Artifact> providerArtifacts = new HashSet<>();
         providerArtifacts.add( provider );


[maven-surefire] 01/02: [SUREFIRE-1585] Align JUnit Platform version at runtime

Posted by ti...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

tibordigana pushed a commit to branch SUREFIRE-1585-tibor2
in repository https://gitbox.apache.org/repos/asf/maven-surefire.git

commit f33943fc5f9dc0fd796ea9a93142d74cd417b626
Author: tibordigana <ti...@apache.org>
AuthorDate: Thu Feb 14 22:04:10 2019 +0100

    [SUREFIRE-1585] Align JUnit Platform version at runtime
---
 .../plugin/surefire/AbstractSurefireMojo.java      |  58 +--
 .../plugin/surefire/AbstractSurefireMojoTest.java  | 443 +++++++++++++++++++++
 2 files changed, 478 insertions(+), 23 deletions(-)

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 f2a4a91..90fc075 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
@@ -847,6 +847,11 @@ public abstract class AbstractSurefireMojo
         }
     }
 
+    void setLogger( Logger logger )
+    {
+        this.logger = logger;
+    }
+
     @Nonnull
     protected final PluginConsoleLogger getConsoleLogger()
     {
@@ -988,8 +993,8 @@ public abstract class AbstractSurefireMojo
     private void executeAfterPreconditionsChecked( @Nonnull DefaultScanResult scanResult )
         throws MojoExecutionException, MojoFailureException
     {
-        TestClassPath testClasspathWrapper = generateTestClasspath();
-        List<ProviderInfo> providers = createProviders( testClasspathWrapper );
+        TestClassPath testClasspath = generateTestClasspath();
+        List<ProviderInfo> providers = createProviders( testClasspath );
 
         RunResult current = noTestsRun();
 
@@ -998,7 +1003,7 @@ public abstract class AbstractSurefireMojo
         {
             try
             {
-                current = current.aggregate( executeProvider( provider, scanResult, testClasspathWrapper ) );
+                current = current.aggregate( executeProvider( provider, scanResult, testClasspath ) );
             }
             catch ( SurefireBooterForkException | SurefireExecutionException | TestSetFailedException e )
             {
@@ -1026,13 +1031,13 @@ public abstract class AbstractSurefireMojo
                                                                    getPluginName() );
     }
 
-    protected List<ProviderInfo> createProviders( TestClassPath testClasspathWrapper )
+    protected List<ProviderInfo> createProviders( TestClassPath testClasspath )
         throws MojoExecutionException
     {
         Artifact junitDepArtifact = getJunitDepArtifact();
         return new ProviderList( new DynamicProviderInfo( null ),
                               new TestNgProviderInfo( getTestNgArtifact() ),
-                              new JUnitPlatformProviderInfo( getJunitPlatformArtifact(), testClasspathWrapper ),
+                              new JUnitPlatformProviderInfo( getJunitPlatformArtifact(), testClasspath ),
                               new JUnitCoreProviderInfo( getJunitArtifact(), junitDepArtifact ),
                               new JUnit4ProviderInfo( getJunitArtifact(), junitDepArtifact ),
                               new JUnit3ProviderInfo() )
@@ -2128,7 +2133,6 @@ public abstract class AbstractSurefireMojo
         return getProjectArtifactMap().get( "junit:junit-dep" );
     }
 
-
     private Artifact getJunitPlatformArtifact()
     {
         Artifact artifact = getProjectArtifactMap().get( getJunitPlatformArtifactName() );
@@ -2878,12 +2882,12 @@ public abstract class AbstractSurefireMojo
         private static final String PROVIDER_DEP_AID = "junit-platform-launcher";
 
         private final Artifact junitPlatformArtifact;
-        private final TestClassPath testClasspathWrapper;
+        private final TestClassPath testClasspath;
 
-        JUnitPlatformProviderInfo( Artifact junitPlatformArtifact, TestClassPath testClasspathWrapper )
+        JUnitPlatformProviderInfo( Artifact junitPlatformArtifact, TestClassPath testClasspath )
         {
             this.junitPlatformArtifact = junitPlatformArtifact;
-            this.testClasspathWrapper = testClasspathWrapper;
+            this.testClasspath = testClasspath;
         }
 
         @Override
@@ -2912,14 +2916,20 @@ public abstract class AbstractSurefireMojo
             String surefireVersion = surefireBooterArtifact.getBaseVersion();
             Map<String, Artifact> providerArtifacts =
                     dependencyResolver.getProviderClasspathAsMap( "surefire-junit-platform", surefireVersion );
-            Map<String, Artifact> testDependencies = testClasspathWrapper.getTestDependencies();
-
+            Map<String, Artifact> testDependencies = testClasspath.getTestDependencies();
+            // pozri hore ten parameter pre junit-platform-engine premenuj hodnotu na junit-platform-commons
             if ( hasDependencyPlatformEngine( testDependencies ) )
             {
                 String filterTestDependency = "org.junit.platform:junit-platform-engine";
                 logDebugOrCliShowErrors( "Test dependencies contain " + filterTestDependency );
                 narrowProviderDependencies( filterTestDependency, providerArtifacts, testDependencies );
             }
+            else if ( hasDependencyPlatformCommons( testDependencies ) )
+            {
+                String filterTestDependency = "org.junit.platform:junit-platform-commons";
+                logDebugOrCliShowErrors( "Test dependencies contain " + filterTestDependency );
+                narrowProviderDependencies( filterTestDependency, providerArtifacts, testDependencies );
+            }
             else if ( hasDependencyJupiterAPI( testDependencies ) )
             {
                 String api = "org.junit.jupiter:junit-jupiter-api";
@@ -2929,12 +2939,10 @@ public abstract class AbstractSurefireMojo
                 addEngineByApi( api, engineGroupId, engineArtifactId, providerArtifacts, testDependencies );
                 alignVersions( version, providerArtifacts, testDependencies );
             }
-            else if ( hasDependencyJUnit4( testDependencies ) )
+            /*else if ( hasDependencyJUnit4( testDependencies ) )
             {
-                String version = testDependencies.get( "junit:junit" ).getBaseVersion();
                 addEngineByApi( "junit:junit", "junit", "junit", providerArtifacts, testDependencies );
-                alignVersions( version, providerArtifacts, testDependencies );
-            }
+            }*/
             return new LinkedHashSet<>( providerArtifacts.values() );
         }
 
@@ -2943,14 +2951,14 @@ public abstract class AbstractSurefireMojo
                                      Map<String, Artifact> providerArtifacts,
                                      Map<String, Artifact> testDependencies )
         {
-            String jupiterVersion = testDependencies.get( api ).getBaseVersion();
+            String version = testDependencies.get( api ).getBaseVersion();
             narrowProviderDependencies( api, providerArtifacts, testDependencies );
-            for ( Artifact jupiterDep : resolve( engineGroupId, engineArtifactId, jupiterVersion, null, "jar" ) )
+            for ( Artifact dep : resolve( engineGroupId, engineArtifactId, version, null, "jar" ) )
             {
-                String key = jupiterDep.getGroupId() + ":" + jupiterDep.getArtifactId();
-                if ( !testDependencies.containsKey( key ) )
+                String key = dep.getGroupId() + ":" + dep.getArtifactId();
+                if ( testDependencies.remove( key ) != null )
                 {
-                    providerArtifacts.put( key, jupiterDep );
+                    providerArtifacts.put( key, dep );
                 }
             }
         }
@@ -2968,8 +2976,8 @@ public abstract class AbstractSurefireMojo
             for ( Artifact engineDep : resolve( groupId, artifactId, version, classifier, type ) )
             {
                 providerArtifacts.remove( engineDep.getGroupId() + ":" + engineDep.getArtifactId() );
-                logDebugOrCliShowErrors( "Removed artifact " + engineDep + " from provider. "
-                        + "Already appears in test classpath." );
+                logDebugOrCliShowErrors( "Removed artifact " + engineDep
+                        + " from provider. Already appears in test classpath." );
             }
             alignVersions( version, providerArtifacts, testDependencies );
         }
@@ -3008,6 +3016,11 @@ public abstract class AbstractSurefireMojo
             return providerArtifacts.containsKey( "org.junit.jupiter:junit-jupiter-api" );
         }
 
+        private boolean hasDependencyPlatformCommons( Map<String, Artifact> providerArtifacts )
+        {
+            return providerArtifacts.containsKey( "org.junit.platform:junit-platform-commons" );
+        }
+
         private boolean hasDependencyPlatformEngine( Map<String, Artifact> providerArtifacts )
         {
             return providerArtifacts.containsKey( "org.junit.platform:junit-platform-engine" );
@@ -3289,7 +3302,6 @@ public abstract class AbstractSurefireMojo
         this.projectArtifactMap = projectArtifactMap;
     }
 
-
     public String getReportNameSuffix()
     {
         return reportNameSuffix;
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java
index c9a332a..016eef8 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java
@@ -22,18 +22,27 @@ package org.apache.maven.plugin.surefire;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.DefaultArtifact;
 import org.apache.maven.artifact.handler.ArtifactHandler;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
+import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
 import org.apache.maven.artifact.versioning.VersionRange;
+import org.apache.maven.model.Dependency;
+import org.apache.maven.plugin.surefire.AbstractSurefireMojo.JUnitPlatformProviderInfo;
 import org.apache.maven.plugin.surefire.log.PluginConsoleLogger;
 import org.apache.maven.project.MavenProject;
+import org.apache.maven.repository.RepositorySystem;
 import org.apache.maven.surefire.booter.ClassLoaderConfiguration;
 import org.apache.maven.surefire.booter.Classpath;
 import org.apache.maven.surefire.booter.StartupConfiguration;
 import org.apache.maven.surefire.suite.RunResult;
 import org.codehaus.plexus.logging.Logger;
+import org.fest.assertions.MapAssert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
 import org.powermock.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
 
@@ -41,6 +50,7 @@ import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
@@ -51,10 +61,13 @@ import java.util.Set;
 import static java.io.File.separatorChar;
 import static java.util.Arrays.asList;
 import static java.util.Collections.singleton;
+import static java.util.Collections.singletonMap;
 import static org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS;
 import static org.apache.maven.artifact.versioning.VersionRange.createFromVersion;
 import static org.apache.maven.artifact.versioning.VersionRange.createFromVersionSpec;
 import static org.fest.assertions.Assertions.assertThat;
+import static org.fest.assertions.MapAssert.entry;
+import static org.junit.Assert.fail;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.times;
@@ -359,9 +372,439 @@ public class AbstractSurefireMojoTest
                 .isDirectory();
     }
 
+    @Test
+    public void shouldSmartlyResolveJUnit5ProviderWithJUnit4() throws Exception
+    {
+        final VersionRange surefireVersion = createFromVersion( "1" );
+
+        Artifact junitPlatformArtifact = new DefaultArtifact( "org.apache.maven.surefire",
+                "surefire-junit-platform", surefireVersion, null, "jar", null, mock( ArtifactHandler.class ) );
+
+        Artifact testClasspathJUnit = new DefaultArtifact( "junit", "junit", createFromVersion( "4.12" ), null, "jar",
+                null, mock( ArtifactHandler.class ) );
+
+        Iterable<Artifact> testArtifacts = singleton( testClasspathJUnit );
+
+        File classesDirectory = new File( "target/classes" );
+
+        File testClassesDirectory = new File( "target/test-classes" );
+
+        TestClassPath testClasspathWrapper =
+                new TestClassPath( testArtifacts, classesDirectory, testClassesDirectory, null );
+
+        Artifact forkedBooter = new DefaultArtifact( "org.apache.maven.surefire",
+                "surefire-booter", surefireVersion, null, "jar", null, mock( ArtifactHandler.class ) );
+
+        mojo.setPluginArtifactMap( singletonMap( "org.apache.maven.surefire:surefire-booter", forkedBooter ) );
+        mojo.setRemoteRepositories( Collections.<ArtifactRepository>emptyList() );
+        mojo.setProjectRemoteRepositories( Collections.<ArtifactRepository>emptyList() );
+        RepositorySystem repositorySystem = mock( RepositorySystem.class );
+        final Artifact surefireProvider = new DefaultArtifact( "org.apache.maven.surefire",
+                "surefire-junit-platform", surefireVersion, null, "jar", null, mock( ArtifactHandler.class ) );
+        when( repositorySystem.createDependencyArtifact( any( Dependency.class ) ) ).thenAnswer( new Answer<Artifact>()
+        {
+            @Override
+            public Artifact answer( InvocationOnMock invocation )
+            {
+                Dependency provider = (Dependency) invocation.getArguments()[0];
+                assertThat( provider.getGroupId() ).isEqualTo( "org.apache.maven.surefire" );
+                assertThat( provider.getArtifactId() ).isEqualTo( "surefire-junit-platform" );
+                return surefireProvider;
+            }
+        } );
+        final ArtifactResolutionResult surefireProviderResolutionResult = mock( ArtifactResolutionResult.class );
+        final ArtifactResolutionResult junit4ResolutionResult = mock( ArtifactResolutionResult.class );
+        when( repositorySystem.resolve( any( ArtifactResolutionRequest.class ) ) )
+                .thenAnswer( new Answer<ArtifactResolutionResult>()
+                {
+                    @Override
+                    public ArtifactResolutionResult answer( InvocationOnMock invocation )
+                    {
+                        ArtifactResolutionRequest req = (ArtifactResolutionRequest) invocation.getArguments()[0];
+                        Artifact artifact = req.getArtifact();
+                        if ( artifact == surefireProvider )
+                        {
+                            return surefireProviderResolutionResult;
+                        }
+                        else if ( artifact.getGroupId().equals( "junit" )
+                                && artifact.getArtifactId().equals( "junit" )
+                                && artifact.getVersion().equals( "4.12" ) )
+                        {
+                            return junit4ResolutionResult;
+                        }
+                        else
+                        {
+                            fail();
+                            return null;
+                        }
+                    }
+                } );
+
+        Artifact java5 = new DefaultArtifact( "org.apache.maven.surefire", "common-java5",
+                surefireVersion, null, "jar", null, mock( ArtifactHandler.class ) );
+        Artifact launcher = new DefaultArtifact( "org.junit.platform", "junit-platform-launcher",
+                createFromVersion( "1.3.2" ), null, "jar", null, mock( ArtifactHandler.class ) );
+        Artifact apiguardian = new DefaultArtifact( "org.apiguardian", "apiguardian-api",
+                createFromVersion( "1.0.0" ), null, "jar", null, mock( ArtifactHandler.class ) );
+        Artifact engine = new DefaultArtifact( "org.junit.platform", "junit-platform-engine",
+                createFromVersion( "1.3.2" ), null, "jar", null, mock( ArtifactHandler.class ) );
+        Artifact commons = new DefaultArtifact( "org.junit.platform", "junit-platform-commons",
+                createFromVersion( "1.3.2" ), null, "jar", null, mock( ArtifactHandler.class ) );
+        Artifact opentest4j = new DefaultArtifact( "org.opentest4j", "opentest4j",
+                createFromVersion( "1.1.1" ), null, "jar", null, mock( ArtifactHandler.class ) );
+        Set<Artifact> providerArtifacts = new HashSet<>();
+        providerArtifacts.add( surefireProvider );
+        providerArtifacts.add( java5 );
+        providerArtifacts.add( launcher );
+        providerArtifacts.add( apiguardian );
+        providerArtifacts.add( engine );
+        providerArtifacts.add( commons );
+        providerArtifacts.add( opentest4j );
+
+        when( surefireProviderResolutionResult.getArtifacts() )
+                .thenReturn( providerArtifacts );
+
+        Artifact junit = new DefaultArtifact( "junit", "junit",
+                createFromVersion( "4.12" ), null, "jar", null, mock( ArtifactHandler.class ) );
+        Artifact hamcrest = new DefaultArtifact( "org.hamcrest", "hamcrest-core",
+                createFromVersion( "1.3" ), null, "jar", null, mock( ArtifactHandler.class ) );
+        Set<Artifact> junitArtifacts = new HashSet<>();
+        junitArtifacts.add( junit );
+        junitArtifacts.add( hamcrest );
+        when( junit4ResolutionResult.getArtifacts() )
+                .thenReturn( junitArtifacts );
+
+        mojo.setRepositorySystem( repositorySystem );
+        mojo.setLogger( mock( Logger.class ) );
+
+        invokeMethod( mojo, "setupStuff" );
+        JUnitPlatformProviderInfo prov =
+                mojo.createJUnitPlatformProviderInfo( junitPlatformArtifact, testClasspathWrapper );
+
+        Artifact expectedProvider = new DefaultArtifact( "org.apache.maven.surefire", "surefire-junit-platform",
+                surefireVersion, null, "jar", null, mock( ArtifactHandler.class ) );
+        Artifact expectedCommonJava5 = new DefaultArtifact( "org.apache.maven.surefire", "common-java5",
+                surefireVersion, null, "jar", null, mock( ArtifactHandler.class ) );
+        Artifact expectedLauncher = new DefaultArtifact( "org.junit.platform", "junit-platform-launcher",
+                createFromVersion( "1.3.2" ), null, "jar", null, mock( ArtifactHandler.class ) );
+        Artifact expectedApiguardian = new DefaultArtifact( "org.apiguardian", "apiguardian-api",
+                createFromVersion( "1.0.0" ), null, "jar", null, mock( ArtifactHandler.class ) );
+        Artifact expectedJUnit5Engine = new DefaultArtifact( "org.junit.platform", "junit-platform-engine",
+                createFromVersion( "1.3.2" ), null, "jar", null, mock( ArtifactHandler.class ) );
+        Artifact expectedOpentest4j = new DefaultArtifact( "org.opentest4j", "opentest4j",
+                createFromVersion( "1.1.1" ), null, "jar", null, mock( ArtifactHandler.class ) );
+        Artifact expectedPlatformCommons = new DefaultArtifact( "org.junit.platform", "junit-platform-commons",
+                createFromVersion( "1.3.2" ), null, "jar", null, mock( ArtifactHandler.class ) );
+        assertThat( prov.getProviderClasspath() )
+                .hasSize( 7 )
+                .containsOnly( expectedProvider, expectedCommonJava5, expectedLauncher, expectedApiguardian,
+                        expectedJUnit5Engine, expectedOpentest4j, expectedPlatformCommons );
+
+        Artifact expectedJUnit = new DefaultArtifact( "junit", "junit",
+                createFromVersion( "4.12" ), null, "jar", null, mock( ArtifactHandler.class ) );
+        assertThat( testClasspathWrapper.getTestDependencies() )
+                .hasSize( 1 )
+                .includes( entry( "junit:junit", expectedJUnit ) );
+    }
+
+    @Test
+    public void shouldSmartlyResolveJUnit5ProviderWithJUnit5Commons() throws Exception
+    {
+        final VersionRange surefireVersion = createFromVersion( "1" );
+
+        Artifact junitPlatformArtifact = new DefaultArtifact( "org.apache.maven.surefire",
+                "surefire-junit-platform", surefireVersion, null, "jar", "", mock( ArtifactHandler.class ) );
+
+        final Artifact testClasspathSomeTestArtifact = new DefaultArtifact( "third.party", "artifact",
+                createFromVersion( "1.0" ), null, "jar", "", null );
+
+        final Artifact testClasspathApiguardian = new DefaultArtifact( "org.apiguardian", "apiguardian-api",
+                createFromVersion( "1.0.0" ), null, "jar", "", null );
+
+        final Artifact testClasspathCommons = new DefaultArtifact( "org.junit.platform", "junit-platform-commons",
+                createFromVersion( "1.4.0" ), null, "jar", "", mock( ArtifactHandler.class ) );
+
+        Iterable<Artifact> testArtifacts =
+                asList( testClasspathSomeTestArtifact, testClasspathApiguardian, testClasspathCommons );
+
+        File classesDirectory = new File( "target/classes" );
+
+        File testClassesDirectory = new File( "target/test-classes" );
+
+        TestClassPath testClasspathWrapper =
+                new TestClassPath( testArtifacts, classesDirectory, testClassesDirectory, null );
+
+        Artifact forkedBooter = new DefaultArtifact( "org.apache.maven.surefire",
+                "surefire-booter", surefireVersion, null, "jar", "", null );
+
+        mojo.setPluginArtifactMap( singletonMap( "org.apache.maven.surefire:surefire-booter", forkedBooter ) );
+        mojo.setRemoteRepositories( Collections.<ArtifactRepository>emptyList() );
+        mojo.setProjectRemoteRepositories( Collections.<ArtifactRepository>emptyList() );
+        RepositorySystem repositorySystem = mock( RepositorySystem.class );
+        final Artifact surefireProvider = new DefaultArtifact( "org.apache.maven.surefire",
+                "surefire-junit-platform", surefireVersion, null, "jar", "", null );
+        when( repositorySystem.createDependencyArtifact( any( Dependency.class ) ) ).thenAnswer( new Answer<Artifact>()
+        {
+            @Override
+            public Artifact answer( InvocationOnMock invocation )
+            {
+                Dependency provider = (Dependency) invocation.getArguments()[0];
+                assertThat( provider.getGroupId() ).isEqualTo( "org.apache.maven.surefire" );
+                assertThat( provider.getArtifactId() ).isEqualTo( "surefire-junit-platform" );
+                return surefireProvider;
+            }
+        } );
+
+        when( repositorySystem.resolve( any( ArtifactResolutionRequest.class ) ) )
+                .thenAnswer( new Answer<ArtifactResolutionResult>()
+                {
+                    @Override
+                    public ArtifactResolutionResult answer( InvocationOnMock invocation )
+                    {
+                        ArtifactResolutionRequest req = (ArtifactResolutionRequest) invocation.getArguments()[0];
+                        if ( req.getArtifact() == surefireProvider )
+                        {
+                            return createSurefireProviderResolutionResult( surefireVersion );
+                        }
+                        else if ( req.getArtifact().equals( testClasspathCommons )  )
+                        {
+                            return createTestClasspathCommonsResolutionResult( testClasspathSomeTestArtifact, null,
+                                    testClasspathApiguardian, testClasspathCommons, null );
+                        }
+                        else if ( "org.junit.platform".equals( req.getArtifact().getGroupId() )
+                                && "junit-platform-launcher".equals( req.getArtifact().getArtifactId() )
+                                && "1.4.0".equals( req.getArtifact().getVersion() ) )
+                        {
+                            return createExpectedJUnitPlatformLauncherResolutionResult();
+                        }
+                        else
+                        {
+                            fail();
+                            return null;
+                        }
+                    }
+                } );
+
+        mojo.setRepositorySystem( repositorySystem );
+        mojo.setLogger( mock( Logger.class ) );
+
+        invokeMethod( mojo, "setupStuff" );
+        JUnitPlatformProviderInfo prov =
+                mojo.createJUnitPlatformProviderInfo( junitPlatformArtifact, testClasspathWrapper );
+        Set<Artifact> resolvedProviderArtifacts = prov.getProviderClasspath();
+
+        Artifact java5 = new DefaultArtifact( "org.apache.maven.surefire", "common-java5",
+                surefireVersion, null, "jar", "", null );
+        Artifact launcher = new DefaultArtifact( "org.junit.platform", "junit-platform-launcher",
+                createFromVersion( "1.4.0" ), null, "jar", "", null );
+        Artifact testClasspathJUnit5 = new DefaultArtifact( "org.junit.platform", "junit-platform-engine",
+                createFromVersion( "1.4.0" ), null, "jar", "", null );
+        Artifact testClasspathOpentest4j = new DefaultArtifact( "org.opentest4j", "opentest4j",
+                createFromVersion( "1.1.1" ), null, "jar", "", null );
+        assertThat( resolvedProviderArtifacts )
+                .hasSize( 5 )
+                .containsOnly( surefireProvider, java5, launcher, testClasspathJUnit5, testClasspathOpentest4j );
+    }
+
+    @Test
+    public void shouldSmartlyResolveJUnit5ProviderWithJUnit5Engine() throws Exception
+    {
+        final VersionRange surefireVersion = createFromVersion( "1" );
+
+        Artifact junitPlatformArtifact = new DefaultArtifact( "org.apache.maven.surefire",
+                "surefire-junit-platform", surefireVersion, null, "jar", "", mock( ArtifactHandler.class ) );
+
+        final Artifact testClasspathSomeTestArtifact = new DefaultArtifact( "third.party", "artifact",
+                createFromVersion( "1.0" ), null, "jar", "", null );
+
+        final Artifact testClasspathJUnit5 = new DefaultArtifact( "org.junit.platform", "junit-platform-engine",
+                createFromVersion( "1.4.0" ), null, "jar", "", null );
+
+        final Artifact testClasspathApiguardian = new DefaultArtifact( "org.apiguardian", "apiguardian-api",
+                createFromVersion( "1.0.0" ), null, "jar", "", null );
+
+        final Artifact testClasspathCommons = new DefaultArtifact( "org.junit.platform", "junit-platform-commons",
+                createFromVersion( "1.4.0" ), null, "jar", "", mock( ArtifactHandler.class ) );
+
+        final Artifact testClasspathOpentest4j = new DefaultArtifact( "org.opentest4j", "opentest4j",
+                createFromVersion( "1.1.1" ), null, "jar", "", null );
+
+        Iterable<Artifact> testArtifacts = asList( testClasspathSomeTestArtifact, testClasspathJUnit5,
+                testClasspathApiguardian, testClasspathCommons, testClasspathOpentest4j );
+
+        File classesDirectory = new File( "target/classes" );
+
+        File testClassesDirectory = new File( "target/test-classes" );
+
+        TestClassPath testClasspathWrapper =
+                new TestClassPath( testArtifacts, classesDirectory, testClassesDirectory, null );
+
+        Artifact forkedBooter = new DefaultArtifact( "org.apache.maven.surefire",
+                "surefire-booter", surefireVersion, null, "jar", "", null );
+
+        mojo.setPluginArtifactMap( singletonMap( "org.apache.maven.surefire:surefire-booter", forkedBooter ) );
+        mojo.setRemoteRepositories( Collections.<ArtifactRepository>emptyList() );
+        mojo.setProjectRemoteRepositories( Collections.<ArtifactRepository>emptyList() );
+        RepositorySystem repositorySystem = mock( RepositorySystem.class );
+        final Artifact surefireProvider = new DefaultArtifact( "org.apache.maven.surefire",
+                "surefire-junit-platform", surefireVersion, null, "jar", "", null );
+        when( repositorySystem.createDependencyArtifact( any( Dependency.class ) ) ).thenAnswer( new Answer<Artifact>()
+        {
+            @Override
+            public Artifact answer( InvocationOnMock invocation )
+            {
+                Dependency provider = (Dependency) invocation.getArguments()[0];
+                assertThat( provider.getGroupId() ).isEqualTo( "org.apache.maven.surefire" );
+                assertThat( provider.getArtifactId() ).isEqualTo( "surefire-junit-platform" );
+                return surefireProvider;
+            }
+        } );
+
+        when( repositorySystem.resolve( any( ArtifactResolutionRequest.class ) ) )
+                .thenAnswer( new Answer<ArtifactResolutionResult>()
+                {
+                    @Override
+                    public ArtifactResolutionResult answer( InvocationOnMock invocation )
+                    {
+                        ArtifactResolutionRequest req = (ArtifactResolutionRequest) invocation.getArguments()[0];
+                        if ( req.getArtifact() == surefireProvider )
+                        {
+                            return createSurefireProviderResolutionResult( surefireVersion );
+                        }
+                        else if ( req.getArtifact().equals( testClasspathJUnit5 )  )
+                        {
+                            return createTestClasspathCommonsResolutionResult( testClasspathSomeTestArtifact,
+                                    testClasspathJUnit5, testClasspathApiguardian, testClasspathCommons,
+                                    testClasspathOpentest4j );
+                        }
+                        else if ( "org.junit.platform".equals( req.getArtifact().getGroupId() )
+                                && "junit-platform-launcher".equals( req.getArtifact().getArtifactId() )
+                                && "1.4.0".equals( req.getArtifact().getVersion() ) )
+                        {
+                            return createJUnitPlatformLauncherResolutionResult( testClasspathJUnit5,
+                                    testClasspathApiguardian, testClasspathCommons, testClasspathOpentest4j );
+                        }
+                        else
+                        {
+                            fail();
+                            return null;
+                        }
+                    }
+                } );
+
+        mojo.setRepositorySystem( repositorySystem );
+        mojo.setLogger( mock( Logger.class ) );
+
+        invokeMethod( mojo, "setupStuff" );
+        JUnitPlatformProviderInfo prov =
+                mojo.createJUnitPlatformProviderInfo( junitPlatformArtifact, testClasspathWrapper );
+        Set<Artifact> resolvedProviderArtifacts = prov.getProviderClasspath();
+
+        Artifact java5 = new DefaultArtifact( "org.apache.maven.surefire", "common-java5",
+                surefireVersion, null, "jar", "", null );
+        Artifact launcher = new DefaultArtifact( "org.junit.platform", "junit-platform-launcher",
+                createFromVersion( "1.4.0" ), null, "jar", "", null );
+        assertThat( resolvedProviderArtifacts )
+                .hasSize( 3 )
+                .containsOnly( surefireProvider, java5, launcher );
+    }
+
+    private static ArtifactResolutionResult createJUnitPlatformLauncherResolutionResult(
+            Artifact junit5Engine, Artifact apiguardian, Artifact commons, Artifact opentest4j )
+    {
+        ArtifactResolutionResult launcherResolutionResult = mock( ArtifactResolutionResult.class );
+        Set<Artifact> resolvedLauncherArtifacts = new HashSet<>();
+        Artifact launcher = new DefaultArtifact( "org.junit.platform", "junit-platform-launcher",
+                commons.getVersionRange(), null, "jar", "", null );
+        resolvedLauncherArtifacts.add( launcher );
+        resolvedLauncherArtifacts.add( apiguardian );
+        resolvedLauncherArtifacts.add( junit5Engine );
+        resolvedLauncherArtifacts.add( commons );
+        resolvedLauncherArtifacts.add( opentest4j );
+        resolvedLauncherArtifacts.remove( null );
+        when( launcherResolutionResult.getArtifacts() )
+                .thenReturn( resolvedLauncherArtifacts );
+        return launcherResolutionResult;
+    }
+
+    private static ArtifactResolutionResult createExpectedJUnitPlatformLauncherResolutionResult()
+    {
+        Artifact engine = new DefaultArtifact( "org.junit.platform", "junit-platform-engine",
+                createFromVersion( "1.4.0" ), null, "jar", "", mock( ArtifactHandler.class ) );
+        Artifact commons = new DefaultArtifact( "org.junit.platform", "junit-platform-commons",
+                createFromVersion( "1.4.0" ), null, "jar", "", mock( ArtifactHandler.class ) );
+        Artifact apiguardian = new DefaultArtifact( "org.apiguardian", "apiguardian-api",
+                createFromVersion( "1.0.0" ), null, "jar", "", null );
+        Artifact opentest4j = new DefaultArtifact( "org.opentest4j", "opentest4j",
+                createFromVersion( "1.1.1" ), null, "jar", "", mock( ArtifactHandler.class ) );
+        return createJUnitPlatformLauncherResolutionResult( engine, apiguardian, commons, opentest4j );
+    }
+
+    private static ArtifactResolutionResult createTestClasspathCommonsResolutionResult(
+            Artifact testClasspathSomeTestArtifact, Artifact testClasspathJUnit5, Artifact testClasspathApiguardian,
+            Artifact testClasspathCommons, Artifact testClasspathOpentest4j )
+    {
+        ArtifactResolutionResult testClasspathCommonsResolutionResult = mock( ArtifactResolutionResult.class );
+        Set<Artifact> resolvedCommonsArtifacts = new HashSet<>();
+        resolvedCommonsArtifacts.add( testClasspathSomeTestArtifact );
+        resolvedCommonsArtifacts.add( testClasspathApiguardian );
+        resolvedCommonsArtifacts.add( testClasspathCommons );
+        resolvedCommonsArtifacts.add( testClasspathJUnit5 );
+        resolvedCommonsArtifacts.add( testClasspathOpentest4j );
+        resolvedCommonsArtifacts.remove( null );
+        when( testClasspathCommonsResolutionResult.getArtifacts() )
+                .thenReturn( resolvedCommonsArtifacts );
+        return testClasspathCommonsResolutionResult;
+    }
+
+    private static ArtifactResolutionResult createSurefireProviderResolutionResult( VersionRange surefireVersion )
+    {
+        ArtifactResolutionResult surefirePlatformResolutionResult = mock( ArtifactResolutionResult.class );
+
+        Artifact provider = new DefaultArtifact( "org.apache.maven.surefire", "surefire-junit-platform",
+                surefireVersion, null, "jar", "", null );
+        Artifact java5 = new DefaultArtifact( "org.apache.maven.surefire", "common-java5",
+                surefireVersion, null, "jar", "", null );
+        Artifact launcher = new DefaultArtifact( "org.junit.platform", "junit-platform-launcher",
+                createFromVersion( "1.3.2" ), null, "jar", "", null );
+        Artifact apiguardian = new DefaultArtifact( "org.apiguardian", "apiguardian-api",
+                createFromVersion( "1.0.0" ), null, "jar", "", null );
+        Artifact engine = new DefaultArtifact( "org.junit.platform", "junit-platform-engine",
+                createFromVersion( "1.3.2" ), null, "jar", "", null );
+        Artifact commons = new DefaultArtifact( "org.junit.platform", "junit-platform-commons",
+                createFromVersion( "1.3.2" ), null, "jar", "", null );
+        Artifact opentest4j = new DefaultArtifact( "org.opentest4j", "opentest4j",
+                createFromVersion( "1.1.1" ), null, "jar", "", null );
+
+        Set<Artifact> providerArtifacts = new HashSet<>();
+        providerArtifacts.add( provider );
+        providerArtifacts.add( java5 );
+        providerArtifacts.add( launcher );
+        providerArtifacts.add( apiguardian );
+        providerArtifacts.add( engine );
+        providerArtifacts.add( commons );
+        providerArtifacts.add( opentest4j );
+
+        when( surefirePlatformResolutionResult.getArtifacts() )
+                .thenReturn( providerArtifacts );
+        return surefirePlatformResolutionResult;
+    }
+
     public static class Mojo
             extends AbstractSurefireMojo
     {
+        private JUnitPlatformProviderInfo createJUnitPlatformProviderInfo( Artifact junitPlatformArtifact,
+                                                                           TestClassPath testClasspathWrapper )
+        {
+            return new JUnitPlatformProviderInfo( junitPlatformArtifact, testClasspathWrapper );
+        }
+
+        @Override
+        protected void logDebugOrCliShowErrors( String s )
+        {
+            // do nothing
+        }
+
         @Override
         protected String getPluginName()
         {