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 db20dc9  Nested tests with class level annotations
db20dc9 is described below

commit db20dc98c6b0c49305f1b0d4dc33669b90141b62
Author: Slawomir Jaranowski <[email protected]>
AuthorDate: Sun Jan 4 23:45:05 2026 +0100

    Nested tests with class level annotations
    
    fix for:
     - Basedir
     - MojoParameter
     - MojoTest with realRepositorySession
---
 .../maven/api/plugin/testing/MojoExtension.java    | 10 +++-
 .../plugin/testing/AnnotationLevelMojoTest.java    | 66 +++++++++++++++++++++-
 .../plugin/testing/SimpleResolveMojoTest.java      | 14 ++++-
 3 files changed, 84 insertions(+), 6 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 f7e19be..fd6c959 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
@@ -171,6 +171,10 @@ public class MojoExtension extends PlexusExtension 
implements ParameterResolver
 
             Set<MojoParameter> mojoParameters = new LinkedHashSet<>();
 
+            extensionContext.getEnclosingTestClasses().forEach(testClass -> {
+                
mojoParameters.addAll(Arrays.asList(testClass.getAnnotationsByType(MojoParameter.class)));
+            });
+
             extensionContext
                     .getTestClass()
                     .map(c -> c.getAnnotationsByType(MojoParameter.class))
@@ -201,7 +205,8 @@ public class MojoExtension extends PlexusExtension 
implements ParameterResolver
         String basedir = 
AnnotationSupport.findAnnotation(context.getElement().get(), Basedir.class)
                 .map(Basedir::value)
                 .orElseGet(() -> {
-                    return 
AnnotationSupport.findAnnotation(context.getTestClass(), Basedir.class)
+                    return AnnotationSupport.findAnnotation(
+                                    context.getRequiredTestClass(), 
Basedir.class, context.getEnclosingTestClasses())
                             .map(Basedir::value)
                             .orElse(null);
                 });
@@ -518,7 +523,8 @@ public class MojoExtension extends PlexusExtension 
implements ParameterResolver
     }
 
     private boolean isRealRepositorySessionNotRequired(ExtensionContext 
context) {
-        return !AnnotationSupport.findAnnotation(context.getTestClass(), 
MojoTest.class)
+        return !AnnotationSupport.findAnnotation(
+                        context.getRequiredTestClass(), MojoTest.class, 
context.getEnclosingTestClasses())
                 .map(MojoTest::realRepositorySession)
                 .orElse(false);
     }
diff --git 
a/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/AnnotationLevelMojoTest.java
 
b/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/AnnotationLevelMojoTest.java
index d897c0c..a4ae93a 100644
--- 
a/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/AnnotationLevelMojoTest.java
+++ 
b/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/AnnotationLevelMojoTest.java
@@ -18,11 +18,14 @@
  */
 package org.apache.maven.plugin.testing;
 
+import java.io.File;
+
 import org.apache.maven.api.plugin.testing.Basedir;
 import org.apache.maven.api.plugin.testing.InjectMojo;
 import org.apache.maven.api.plugin.testing.MojoExtension;
 import org.apache.maven.api.plugin.testing.MojoParameter;
 import org.apache.maven.api.plugin.testing.MojoTest;
+import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -33,12 +36,14 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 @MojoParameter(name = "plain", value = "class-value")
 class AnnotationLevelMojoTest {
 
+    private static final String FS = File.separator;
+
     @Test
     @InjectMojo(goal = "parameters")
     void classLevelValues(ParametersMojo mojo) {
         assertEquals("class-value", mojo.getPlain());
         assertTrue(
-                MojoExtension.getBasedir().endsWith("class-basedir"),
+                MojoExtension.getBasedir().endsWith(FS + "class-basedir"),
                 "Basedir value did not came from class annotation");
     }
 
@@ -49,7 +54,7 @@ class AnnotationLevelMojoTest {
     void methodLevelValues(ParametersMojo mojo) {
         assertEquals("method-value", mojo.getPlain());
         assertTrue(
-                MojoExtension.getBasedir().endsWith("method-basedir"),
+                MojoExtension.getBasedir().endsWith(FS + "method-basedir"),
                 "Basedir value did not came from method annotation");
     }
 
@@ -69,4 +74,61 @@ class AnnotationLevelMojoTest {
         assertEquals("method-value", mojo.getPlain());
         assertEquals("param-value", alternateMojo.getPlain());
     }
+
+    @Nested
+    class NestedTest {
+        // all tests are duplicated from parent class
+
+        protected String nestedAnnotationValue() {
+            return "";
+        }
+
+        @Test
+        @InjectMojo(goal = "parameters")
+        void classLevelValues(ParametersMojo mojo) {
+            assertEquals(nestedAnnotationValue() + "class-value", 
mojo.getPlain());
+            assertTrue(
+                    MojoExtension.getBasedir().endsWith(FS + 
nestedAnnotationValue() + "class-basedir"),
+                    "Basedir value did not came from class annotation: " + 
MojoExtension.getBasedir());
+        }
+
+        @Test
+        @InjectMojo(goal = "parameters")
+        @Basedir("method-basedir")
+        @MojoParameter(name = "plain", value = "method-value")
+        void methodLevelValues(ParametersMojo mojo) {
+            assertEquals("method-value", mojo.getPlain());
+            assertTrue(
+                    MojoExtension.getBasedir().endsWith(FS + "method-basedir"),
+                    "Basedir value did not came from method annotation");
+        }
+
+        @Test
+        void parameterLevelValues(
+                @InjectMojo(goal = "parameters") @MojoParameter(name = 
"plain", value = "param-level-param-value")
+                        ParametersMojo mojo) {
+            assertEquals("param-level-param-value", mojo.getPlain());
+        }
+
+        @Test
+        @MojoParameter(name = "plain", value = "method-value")
+        void mojoParameterOnMethod(
+                @InjectMojo(goal = "parameters") ParametersMojo mojo,
+                @InjectMojo(goal = "parameters") @MojoParameter(name = 
"plain", value = "param-value")
+                        ParametersMojo alternateMojo) {
+            assertEquals("method-value", mojo.getPlain());
+            assertEquals("param-value", alternateMojo.getPlain());
+        }
+    }
+
+    @Nested
+    @Basedir("nested-class-basedir")
+    @MojoParameter(name = "plain", value = "nested-class-value")
+    class NestedAnnotationLevelTest extends NestedTest {
+
+        @Override
+        protected String nestedAnnotationValue() {
+            return "nested-";
+        }
+    }
 }
diff --git 
a/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/SimpleResolveMojoTest.java
 
b/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/SimpleResolveMojoTest.java
index 9f69757..d5e9304 100644
--- 
a/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/SimpleResolveMojoTest.java
+++ 
b/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/SimpleResolveMojoTest.java
@@ -27,8 +27,8 @@ import org.apache.maven.api.plugin.testing.InjectMojo;
 import org.apache.maven.api.plugin.testing.MojoParameter;
 import org.apache.maven.api.plugin.testing.MojoTest;
 import org.apache.maven.execution.MavenSession;
-import org.apache.maven.plugin.MojoExecutionException;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.io.TempDir;
 
@@ -62,8 +62,18 @@ class SimpleResolveMojoTest {
     @Test
     @InjectMojo(goal = "simple-resolve")
     @MojoParameter(name = "artifact", value = 
"org.apache.commons:commons-lang3:3.20.0")
-    void artifactShouldBeResolved(SimpleResolveMojo mojo) throws 
MojoExecutionException {
+    void artifactShouldBeResolved(SimpleResolveMojo mojo) {
         assertDoesNotThrow(mojo::execute);
     }
+
+    @Nested
+    class NestedTest {
+        @Test
+        @InjectMojo(goal = "simple-resolve")
+        @MojoParameter(name = "artifact", value = 
"org.apache.commons:commons-lang3:3.20.0")
+        void artifactShouldBeResolved(SimpleResolveMojo mojo) {
+            assertDoesNotThrow(mojo::execute);
+        }
+    }
 }
 // END SNIPPET: resolve-mojo-test

Reply via email to