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

sjaranowski pushed a commit to branch maven-plugin-testing-3.x
in repository https://gitbox.apache.org/repos/asf/maven-plugin-testing.git


The following commit(s) were added to refs/heads/maven-plugin-testing-3.x by 
this push:
     new 8a6062a  Provide more default values by generated mocks
8a6062a is described below

commit 8a6062a025bd381488bc4dc16de5bd0e99e423d9
Author: Slawomir Jaranowski <[email protected]>
AuthorDate: Wed Dec 31 14:43:29 2025 +0100

    Provide more default values by generated mocks
    
    - MojoExecution - will be a spy with current mojoDescriptor
    - MavenProject - will be a spy with default build path
    - Log - will be a spy
    - add some of static util methods from PlexusExtension
---
 .../maven/api/plugin/testing/MojoExtension.java    | 102 ++++++++++++++++-----
 .../maven/plugin/testing/ParametersMojoTest.java   |  11 +++
 .../plugin/testing/ProvidesInjectMojoTest.java     |  19 +++-
 3 files changed, 106 insertions(+), 26 deletions(-)

diff --git 
a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/MojoExtension.java
 
b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/MojoExtension.java
index 0ed3ba5..ccf3ee6 100644
--- 
a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/MojoExtension.java
+++ 
b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/MojoExtension.java
@@ -60,6 +60,9 @@ import org.apache.maven.execution.MavenSession;
 import org.apache.maven.execution.scope.internal.MojoExecutionScope;
 import org.apache.maven.internal.aether.DefaultRepositorySystemSessionFactory;
 import org.apache.maven.lifecycle.internal.MojoDescriptorCreator;
+import org.apache.maven.model.Build;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.model.Resource;
 import org.apache.maven.plugin.Mojo;
 import org.apache.maven.plugin.MojoExecution;
 import org.apache.maven.plugin.PluginParameterExpressionEvaluator;
@@ -228,7 +231,7 @@ public class MojoExtension extends PlexusExtension 
implements ParameterResolver
                     binder.install(new MavenProvidesModule(testInstance));
                 }));
 
-        addMock(plexusContainer, Log.class, () -> new 
MojoLogWrapper(LoggerFactory.getLogger("anonymous")));
+        addMock(plexusContainer, Log.class, () -> spy(new 
MojoLogWrapper(LoggerFactory.getLogger("anonymous"))));
         MavenProject mavenProject = addMock(plexusContainer, 
MavenProject.class, this::mockMavenProject);
         MojoExecution mojoExecution = addMock(plexusContainer, 
MojoExecution.class, this::mockMojoExecution);
         MavenSession mavenSession = addMock(plexusContainer, 
MavenSession.class, this::mockMavenSession);
@@ -261,7 +264,11 @@ public class MojoExtension extends PlexusExtension 
implements ParameterResolver
                 InterpolationFilterReader interpolationReader = new 
InterpolationFilterReader(reader, map, "${", "}")) {
 
             PluginDescriptor pluginDescriptor = new 
PluginDescriptorBuilder().build(interpolationReader);
-
+            Plugin plugin = new Plugin();
+            plugin.setGroupId(pluginDescriptor.getGroupId());
+            plugin.setArtifactId(pluginDescriptor.getArtifactId());
+            plugin.setVersion(pluginDescriptor.getVersion());
+            pluginDescriptor.setPlugin(plugin);
             context.getStore(MOJO_EXTENSION).put(PluginDescriptor.class, 
pluginDescriptor);
 
             for (ComponentDescriptor<?> desc : 
pluginDescriptor.getComponents()) {
@@ -298,7 +305,7 @@ public class MojoExtension extends PlexusExtension 
implements ParameterResolver
      * @return a MojoExecution mock
      */
     private MojoExecution mockMojoExecution() {
-        return Mockito.mock(MojoExecution.class);
+        return spy(new MojoExecution(null));
     }
 
     /**
@@ -319,8 +326,29 @@ public class MojoExtension extends PlexusExtension 
implements ParameterResolver
      * @return a MavenProject mock
      */
     private MavenProject mockMavenProject() {
-        MavenProject mavenProject = Mockito.mock(MavenProject.class);
-        lenient().when(mavenProject.getProperties()).thenReturn(new 
Properties());
+        MavenProject mavenProject = spy(new MavenProject());
+        Build build = spy(new Build());
+
+        build.setDirectory(Paths.get(getBasedir(), "target").toString());
+        build.setOutputDirectory(Paths.get(getBasedir(), "target", 
"classes").toString());
+        build.setTestOutputDirectory(
+                Paths.get(getBasedir(), "target", "test-classes").toString());
+        build.setSourceDirectory(Paths.get(getBasedir(), "src", "main", 
"java").toString());
+        build.setTestSourceDirectory(
+                Paths.get(getBasedir(), "src", "test", "java").toString());
+
+        Resource resource = spy(new Resource());
+        resource.setDirectory(Paths.get(getBasedir(), "src", "main", 
"resource").toString());
+        build.setResources(Arrays.asList(resource));
+
+        Resource testResource = spy(new Resource());
+        testResource.setDirectory(
+                Paths.get(getBasedir(), "src", "test", "resource").toString());
+        build.setTestResources(Arrays.asList(resource));
+
+        mavenProject.setBuild(build);
+        mavenProject.addCompileSourceRoot(build.getSourceDirectory());
+        mavenProject.addTestCompileSourceRoot(build.getTestSourceDirectory());
         return mavenProject;
     }
 
@@ -339,32 +367,33 @@ public class MojoExtension extends PlexusExtension 
implements ParameterResolver
         String pom = injectMojo.pom();
         Path basedir = Paths.get(getTestBasedir(extensionContext));
         String[] coord = mojoCoordinates(goal, descriptor);
-        Xpp3Dom pomDom;
+        Xpp3Dom pomDom = null;
+        Path pomPath = null;
         if (pom.startsWith("file:")) {
-            Path path = basedir.resolve(pom.substring("file:".length()));
-            pomDom = Xpp3DomBuilder.build(new XmlStreamReader(path.toFile()));
+            pomPath = basedir.resolve(pom.substring("file:".length()));
         } else if (pom.startsWith("classpath:")) {
             URL url = holder.getResource(pom.substring("classpath:".length()));
             if (url == null) {
                 throw new IllegalStateException("Unable to find pom on 
classpath: " + pom);
             }
-            pomDom = Xpp3DomBuilder.build(new 
XmlStreamReader(url.openStream()));
+            pomPath = Paths.get(url.toURI());
         } else if (pom.contains("<project>")) {
             pomDom = Xpp3DomBuilder.build(new StringReader(pom));
         } else if (!pom.isEmpty()) {
-            Path path = basedir.resolve(pom);
-            pomDom = Xpp3DomBuilder.build(new XmlStreamReader(path.toFile()));
+            pomPath = basedir.resolve(pom);
         } else if (isBasedirSet(extensionContext)) {
             // only look for a pom.xml if basedir is explicitly set
-            Path path = basedir.resolve("pom.xml");
-            if (Files.exists(path)) {
-                pomDom = Xpp3DomBuilder.build(new 
XmlStreamReader(path.toFile()));
+            pomPath = basedir.resolve("pom.xml");
+        }
+
+        if (pomDom == null) {
+            if (pomPath != null && Files.exists(pomPath)) {
+                pomDom = Xpp3DomBuilder.build(new 
XmlStreamReader(pomPath.toFile()));
             } else {
                 pomDom = new Xpp3Dom("");
             }
-        } else {
-            pomDom = new Xpp3Dom("");
         }
+
         Xpp3Dom pluginConfiguration = extractPluginConfiguration(coord[1], 
pomDom);
         if (!mojoParameters.isEmpty()) {
             List<Xpp3Dom> children = mojoParameters.stream()
@@ -378,7 +407,7 @@ public class MojoExtension extends PlexusExtension 
implements ParameterResolver
             children.forEach(config::addChild);
             pluginConfiguration = Xpp3Dom.mergeXpp3Dom(config, 
pluginConfiguration);
         }
-        return lookupMojo(extensionContext, coord, pluginConfiguration, 
descriptor);
+        return lookupMojo(extensionContext, coord, pluginConfiguration, 
descriptor, pomPath);
     }
 
     private boolean isBasedirSet(ExtensionContext extensionContext) {
@@ -400,7 +429,11 @@ public class MojoExtension extends PlexusExtension 
implements ParameterResolver
      * lookup the mojo while we have all the relevent information
      */
     protected Mojo lookupMojo(
-            ExtensionContext extensionContext, String[] coord, Xpp3Dom 
pluginConfiguration, PluginDescriptor descriptor)
+            ExtensionContext extensionContext,
+            String[] coord,
+            Xpp3Dom pluginConfiguration,
+            PluginDescriptor descriptor,
+            Path pomPath)
             throws Exception {
         PlexusContainer plexusContainer = getContainer(extensionContext);
 
@@ -426,17 +459,26 @@ public class MojoExtension extends PlexusExtension 
implements ParameterResolver
 
         if (mockingDetails(session).isMock()) {
             lenient().doReturn(mavenProject).when(session).getCurrentProject();
+            
lenient().doReturn(request.getLocalRepository()).when(session).getLocalRepository();
         }
 
         if (mockingDetails(mavenProject).isMock()) {
-            lenient()
-                    .doReturn(new File(getTestBasedir(extensionContext)))
-                    .when(mavenProject)
-                    .getBasedir();
+            if (mockingDetails(mavenProject).isSpy() && pomPath != null) {
+                mavenProject.setFile(pomPath.toFile());
+            } else {
+                lenient()
+                        .doReturn(new File(getTestBasedir(extensionContext)))
+                        .when(mavenProject)
+                        .getBasedir();
+            }
         }
 
         if (mojoDescriptor.isPresent() && 
mockingDetails(mojoExecution).isMock()) {
-            
lenient().doReturn(mojoDescriptor.get()).when(mojoExecution).getMojoDescriptor();
+            if (mockingDetails(mojoExecution).isSpy()) {
+                mojoExecution.setMojoDescriptor(mojoDescriptor.get());
+            } else {
+                
lenient().doReturn(mojoDescriptor.get()).when(mojoExecution).getMojoDescriptor();
+            }
         }
 
         if (pluginConfiguration != null) {
@@ -662,6 +704,20 @@ public class MojoExtension extends PlexusExtension 
implements ParameterResolver
         return PlexusExtension.getBasedir();
     }
 
+    /**
+     * Gets the file according to base directory for test resources.
+     */
+    public static File getTestFile(String path) {
+        return PlexusExtension.getTestFile(path);
+    }
+
+    /**
+     * Gets the path according to base directory for test resources.
+     */
+    public static String getTestPath(String path) {
+        return PlexusExtension.getTestPath(path);
+    }
+
     /**
      * Convenience method to set values to variables in objects that don't 
have setters
      */
diff --git 
a/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/ParametersMojoTest.java
 
b/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/ParametersMojoTest.java
index 04f1d4f..a0bd5d4 100644
--- 
a/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/ParametersMojoTest.java
+++ 
b/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/ParametersMojoTest.java
@@ -21,6 +21,7 @@ package org.apache.maven.plugin.testing;
 import javax.inject.Inject;
 
 import java.io.File;
+import java.nio.file.Paths;
 
 import org.apache.maven.api.plugin.testing.Basedir;
 import org.apache.maven.api.plugin.testing.InjectMojo;
@@ -246,4 +247,14 @@ public class ParametersMojoTest {
         assertNotNull(mojo);
         assertNotNull(testInfo);
     }
+
+    @Test
+    @InjectMojo(goal = "parameters")
+    @MojoParameter(name = "plain", value = 
"${project.build.directory}/generated")
+    void projectBuildDirectoryShouldBeResolved(ParametersMojo mojo) {
+        assertEquals(
+                Paths.get(MojoExtension.getBasedir(), "target", 
"generated").normalize(),
+                Paths.get(mojo.getPlain()).normalize());
+        assertDoesNotThrow(mojo::execute);
+    }
 }
diff --git 
a/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/ProvidesInjectMojoTest.java
 
b/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/ProvidesInjectMojoTest.java
index b03ca09..6b0a468 100644
--- 
a/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/ProvidesInjectMojoTest.java
+++ 
b/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/ProvidesInjectMojoTest.java
@@ -26,13 +26,11 @@ import org.apache.maven.execution.MavenSession;
 import org.apache.maven.plugin.MojoExecution;
 import org.apache.maven.project.MavenProject;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.junit.jupiter.MockitoExtension;
 
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertSame;
 
-@ExtendWith(MockitoExtension.class)
 @MojoTest
 public class ProvidesInjectMojoTest {
 
@@ -60,4 +58,19 @@ public class ProvidesInjectMojoTest {
         assertSame(mojoExecution, mojo.getMojoExecution());
         assertSame(mojoExecution, mojo.getMojoExecutionFromBean());
     }
+
+    @Test
+    @InjectMojo(pom = POM, goal = "test:test-plugin:0.0.1-SNAPSHOT:provides")
+    public void defaultValuesShouldBeProvided(ProvidesInjectMojo mojo) {
+        assertNotNull(mojo);
+        assertNotNull(mojo.getProject().getBasedir());
+        assertNotNull(mojo.getProject().getBuild().getOutputDirectory());
+        assertNotNull(mojo.getProject().getBuild().getTestOutputDirectory());
+        assertFalse(mojo.getProject().getBuild().getResources().isEmpty());
+        assertFalse(mojo.getProject().getBuild().getTestResources().isEmpty());
+        assertFalse(mojo.getProject().getCompileSourceRoots().isEmpty());
+        assertFalse(mojo.getProject().getTestCompileSourceRoots().isEmpty());
+        assertFalse(mojo.getProject().getResources().isEmpty());
+        assertFalse(mojo.getProject().getTestResources().isEmpty());
+    }
 }

Reply via email to