From 1e2c18781070ea0d1644de6b81fe7caa730ed2be Mon Sep 17 00:00:00 2001 From: Slawomir Jaranowski Date: Sun, 4 Jan 2026 23:45:05 +0100 Subject: [PATCH] Nested tests with class level annotations fix for: - Basedir - MojoParameter - MojoTest with realRepositorySession --- .../api/plugin/testing/MojoExtension.java | 10 ++- .../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 Object resolveParameter(ParameterContext parameterContext, ExtensionConte Set 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 void beforeEach(ExtensionContext context) throws Exception { 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 @@ protected Mojo lookupMojo( } 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 @@ @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 @@ void classLevelValues(ParametersMojo mojo) { 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 @@ void mojoParameterOnMethod( 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.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 @@ void beforeEach() { @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