3535import java .util .Arrays ;
3636import java .util .Collection ;
3737import java .util .Collections ;
38+ import java .util .Date ;
3839import java .util .HashMap ;
3940import java .util .LinkedHashSet ;
4041import java .util .List ;
5051import com .google .inject .Binder ;
5152import com .google .inject .Module ;
5253import com .google .inject .internal .ProviderMethodsModule ;
54+ import org .apache .maven .RepositoryUtils ;
5355import org .apache .maven .api .di .Provides ;
56+ import org .apache .maven .execution .DefaultMavenExecutionRequest ;
57+ import org .apache .maven .execution .MavenExecutionRequest ;
58+ import org .apache .maven .execution .MavenExecutionRequestPopulator ;
5459import org .apache .maven .execution .MavenSession ;
5560import org .apache .maven .execution .scope .internal .MojoExecutionScope ;
61+ import org .apache .maven .internal .aether .DefaultRepositorySystemSessionFactory ;
5662import org .apache .maven .lifecycle .internal .MojoDescriptorCreator ;
5763import org .apache .maven .plugin .Mojo ;
5864import org .apache .maven .plugin .MojoExecution ;
8187import org .codehaus .plexus .util .xml .XmlStreamReader ;
8288import org .codehaus .plexus .util .xml .Xpp3Dom ;
8389import org .codehaus .plexus .util .xml .Xpp3DomBuilder ;
90+ import org .eclipse .aether .RepositorySystemSession ;
8491import org .junit .jupiter .api .extension .ExtensionContext ;
8592import org .junit .jupiter .api .extension .ParameterContext ;
8693import org .junit .jupiter .api .extension .ParameterResolutionException ;
93100import static org .mockito .Mockito .clearInvocations ;
94101import static org .mockito .Mockito .lenient ;
95102import static org .mockito .Mockito .mockingDetails ;
103+ import static org .mockito .Mockito .spy ;
96104
97105/**
98106 * JUnit Jupiter extension that provides support for testing Maven plugins (Mojos).
@@ -223,6 +231,9 @@ public void beforeEach(ExtensionContext context) throws Exception {
223231 MojoExecution mojoExecution = addMock (plexusContainer , MojoExecution .class , this ::mockMojoExecution );
224232 MavenSession mavenSession = addMock (plexusContainer , MavenSession .class , this ::mockMavenSession );
225233
234+ // prepare MavenExecutionRequest to be available in BeforeEach methods in test classes
235+ createMavenExecutionRequest (context );
236+
226237 SessionScope sessionScope = plexusContainer .lookup (SessionScope .class );
227238 sessionScope .enter ();
228239 sessionScope .seed (MavenSession .class , mavenSession );
@@ -388,6 +399,11 @@ protected Mojo lookupMojo(
388399 ExtensionContext extensionContext , String [] coord , Xpp3Dom pluginConfiguration , PluginDescriptor descriptor )
389400 throws Exception {
390401 PlexusContainer plexusContainer = getContainer (extensionContext );
402+
403+ MavenExecutionRequest request = setupMavenExecutionRequest (extensionContext );
404+ plexusContainer .lookup (MavenExecutionRequestPopulator .class ).populateDefaults (request );
405+ setupRepositorySession (extensionContext , request );
406+
391407 // pluginkey = groupId : artifactId : version : goal
392408 Mojo mojo = plexusContainer .lookup (Mojo .class , coord [0 ] + ":" + coord [1 ] + ":" + coord [2 ] + ":" + coord [3 ]);
393409
@@ -405,15 +421,18 @@ protected Mojo lookupMojo(
405421 MojoExecution mojoExecution = plexusContainer .lookup (MojoExecution .class );
406422
407423 if (mockingDetails (session ).isMock ()) {
408- lenient ().when (session .getCurrentProject ()). thenReturn ( mavenProject );
424+ lenient ().doReturn ( mavenProject ). when (session ) .getCurrentProject ();
409425 }
410426
411427 if (mockingDetails (mavenProject ).isMock ()) {
412- lenient ().when (mavenProject .getBasedir ()).thenReturn (new File (getTestBasedir (extensionContext )));
428+ lenient ()
429+ .doReturn (new File (getTestBasedir (extensionContext )))
430+ .when (mavenProject )
431+ .getBasedir ();
413432 }
414433
415434 if (mojoDescriptor .isPresent () && mockingDetails (mojoExecution ).isMock ()) {
416- lenient ().when ( mojoExecution . getMojoDescriptor ()).thenReturn ( mojoDescriptor . get () );
435+ lenient ().doReturn ( mojoDescriptor . get ()).when ( mojoExecution ). getMojoDescriptor ( );
417436 }
418437
419438 if (pluginConfiguration != null ) {
@@ -445,6 +464,100 @@ protected Mojo lookupMojo(
445464 return mojo ;
446465 }
447466
467+ private boolean isRealRepositorySessionNotRequired (ExtensionContext context ) {
468+ return !AnnotationSupport .findAnnotation (context .getTestClass (), MojoTest .class )
469+ .map (MojoTest ::realRepositorySession )
470+ .orElse (false );
471+ }
472+
473+ /**
474+ * Create a MavenExecutionRequest if not already present in the MavenSession
475+ */
476+ private void createMavenExecutionRequest (ExtensionContext context ) throws ComponentLookupException {
477+ PlexusContainer container = getContainer (context );
478+ MavenSession session = container .lookup (MavenSession .class );
479+ MavenExecutionRequest request = session .getRequest ();
480+
481+ if (request == null && mockingDetails (session ).isMock ()) {
482+ lenient ()
483+ .doReturn (spy (new DefaultMavenExecutionRequest ()))
484+ .when (session )
485+ .getRequest ();
486+ }
487+ }
488+
489+ private MavenExecutionRequest setupMavenExecutionRequest (ExtensionContext context ) throws ComponentLookupException {
490+ PlexusContainer container = getContainer (context );
491+ MavenSession session = container .lookup (MavenSession .class );
492+ MavenExecutionRequest request = session .getRequest ();
493+
494+ if (request == null ) {
495+ // user can provide own MavenSession instance without a request
496+ request = new DefaultMavenExecutionRequest ();
497+ }
498+
499+ if (request .getStartTime () == null ) {
500+ request .setStartTime (new Date ());
501+ }
502+
503+ if (request .getUserProperties ().isEmpty ()) {
504+ request .setUserProperties (session .getUserProperties ());
505+ }
506+
507+ if (request .getSystemProperties ().isEmpty ()) {
508+ request .setSystemProperties (session .getSystemProperties ());
509+ }
510+
511+ // set a default local repository path if none is set
512+ if (request .getLocalRepositoryPath () == null && request .getLocalRepository () == null ) {
513+ request .setLocalRepositoryPath (getTestBasedir (context ) + "/target/local-repo" );
514+ }
515+
516+ if (request .getBaseDirectory () == null ) {
517+ request .setBaseDirectory (new File (getTestBasedir (context )));
518+ }
519+
520+ return request ;
521+ }
522+
523+ private void setupRepositorySession (ExtensionContext context , MavenExecutionRequest request )
524+ throws ComponentLookupException {
525+
526+ if (isRealRepositorySessionNotRequired (context )) {
527+ return ;
528+ }
529+
530+ PlexusContainer container = getContainer (context );
531+
532+ MavenProject mavenProject = container .lookup (MavenProject .class );
533+ if (mockingDetails (mavenProject ).isMock ()) {
534+ lenient ()
535+ .doReturn (request .getRemoteRepositories ())
536+ .when (mavenProject )
537+ .getRemoteArtifactRepositories ();
538+ lenient ()
539+ .doReturn (request .getPluginArtifactRepositories ())
540+ .when (mavenProject )
541+ .getPluginArtifactRepositories ();
542+ lenient ()
543+ .doReturn (RepositoryUtils .toRepos (request .getRemoteRepositories ()))
544+ .when (mavenProject )
545+ .getRemoteProjectRepositories ();
546+ lenient ()
547+ .doReturn (RepositoryUtils .toRepos (request .getPluginArtifactRepositories ()))
548+ .when (mavenProject )
549+ .getRemotePluginRepositories ();
550+ }
551+
552+ RepositorySystemSession repositorySystemSession =
553+ container .lookup (DefaultRepositorySystemSessionFactory .class ).newRepositorySession (request );
554+
555+ MavenSession session = container .lookup (MavenSession .class );
556+ if (mockingDetails (session ).isMock ()) {
557+ lenient ().doReturn (repositorySystemSession ).when (session ).getRepositorySession ();
558+ }
559+ }
560+
448561 private Xpp3Dom finalizeConfig (Xpp3Dom config , MojoDescriptor mojoDescriptor ) {
449562 List <Xpp3Dom > children = new ArrayList <>();
450563 if (mojoDescriptor != null && mojoDescriptor .getParameters () != null ) {
0 commit comments