From e43707ec494748864eaa81f8f3cca4fb717f8b42 Mon Sep 17 00:00:00 2001 From: Slawomir Jaranowski Date: Wed, 22 Oct 2025 23:46:34 +0200 Subject: [PATCH] Add MavenSession to session scope - mocks will be created if not provided by test --- maven-plugin-testing-harness/pom.xml | 9 ++++ .../api/plugin/testing/MojoExtension.java | 37 +++++++++++++++-- .../plugin/testing/ProvidesInjectMojo.java | 8 +++- .../testing/ProvidesInjectMojoTest.java | 9 +++- .../ProvidesInjectOverrideMojoTest.java | 1 + .../apache/maven/plugin/testing/TestBean.java | 41 +++++++++++++++++++ 6 files changed, 99 insertions(+), 6 deletions(-) create mode 100644 maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/TestBean.java diff --git a/maven-plugin-testing-harness/pom.xml b/maven-plugin-testing-harness/pom.xml index fc36aea1..af46327d 100644 --- a/maven-plugin-testing-harness/pom.xml +++ b/maven-plugin-testing-harness/pom.xml @@ -165,4 +165,13 @@ under the License. test + + + + + org.eclipse.sisu + sisu-maven-plugin + + + 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 bed529e9..268a033f 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 @@ -42,6 +42,7 @@ import java.util.Optional; import java.util.Properties; import java.util.Set; +import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -61,6 +62,7 @@ import org.apache.maven.plugin.logging.Log; import org.apache.maven.plugin.testing.MojoLogWrapper; import org.apache.maven.project.MavenProject; +import org.apache.maven.session.scope.internal.SessionScope; import org.codehaus.plexus.DefaultPlexusContainer; import org.codehaus.plexus.PlexusContainer; import org.codehaus.plexus.component.configurator.BasicComponentConfigurator; @@ -151,11 +153,19 @@ public void beforeEach(ExtensionContext context) throws Exception { ((DefaultPlexusContainer) plexusContainer).addPlexusInjector(Collections.emptyList(), binder -> { binder.install(ProviderMethodsModule.forObject(context.getRequiredTestInstance())); binder.install(new MavenProvidesModule(context.getRequiredTestInstance())); + }); + + addMock(plexusContainer, Log.class, () -> new MojoLogWrapper(LoggerFactory.getLogger("anonymous"))); + addMock(plexusContainer, MavenProject.class, this::mockMavenProject); + addMock(plexusContainer, MojoExecution.class, this::mockMojoExecution); + + MavenSession mavenSession = addMock(plexusContainer, MavenSession.class, this::mockMavenSession); + SessionScope sessionScope = plexusContainer.lookup(SessionScope.class); + sessionScope.enter(); + sessionScope.seed(MavenSession.class, mavenSession); + + ((DefaultPlexusContainer) plexusContainer).addPlexusInjector(Collections.emptyList(), binder -> { binder.requestInjection(context.getRequiredTestInstance()); - binder.bind(Log.class).toInstance(new MojoLogWrapper(LoggerFactory.getLogger("anonymous"))); - binder.bind(MavenProject.class).toInstance(mockMavenProject()); - binder.bind(MavenSession.class).toInstance(mockMavenSession()); - binder.bind(MojoExecution.class).toInstance(mockMojoExecution()); }); Map map = plexusContainer.getContext().getContextData(); @@ -177,6 +187,25 @@ public void beforeEach(ExtensionContext context) throws Exception { } } + private T addMock(PlexusContainer container, Class role, Supplier supplier) + throws ComponentLookupException { + if (!container.hasComponent(role)) { + T mock = supplier.get(); + container.addComponent(mock, role, "default"); + return mock; + } else { + return container.lookup(role); + } + } + + @Override + public void afterEach(ExtensionContext context) throws Exception { + SessionScope sessionScope = getContainer(context).lookup(SessionScope.class); + sessionScope.exit(); + + super.afterEach(context); + } + /** * Default MojoExecution mock * diff --git a/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/ProvidesInjectMojo.java b/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/ProvidesInjectMojo.java index 887e6c64..b9b7df99 100644 --- a/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/ProvidesInjectMojo.java +++ b/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/ProvidesInjectMojo.java @@ -28,11 +28,13 @@ public class ProvidesInjectMojo extends AbstractMojo { private final MavenSession session; private final MavenProject project; + private final TestBean testBean; @Inject - public ProvidesInjectMojo(MavenSession session, MavenProject project) { + public ProvidesInjectMojo(MavenSession session, MavenProject project, TestBean testBean) { this.session = session; this.project = project; + this.testBean = testBean; } @Override @@ -42,6 +44,10 @@ public MavenSession getSession() { return session; } + public MavenSession getSessionFromBean() { + return testBean.getSession(); + } + public MavenProject getProject() { return project; } 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 b5c1b24e..03e5e8ec 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 @@ -18,9 +18,12 @@ */ package org.apache.maven.plugin.testing; +import javax.inject.Inject; + import org.apache.maven.api.di.Provides; import org.apache.maven.api.plugin.testing.InjectMojo; import org.apache.maven.api.plugin.testing.MojoTest; +import org.apache.maven.execution.MavenSession; import org.apache.maven.project.MavenProject; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -36,6 +39,9 @@ public class ProvidesInjectMojoTest { private static final String POM = "" + ""; + @Inject + private MavenSession session; + @Mock private MavenProject project; @@ -48,7 +54,8 @@ public MavenProject mockMavenProject() { @InjectMojo(pom = POM, goal = "test:test-plugin:0.0.1-SNAPSHOT:provides") public void bennShouldBeInjected(ProvidesInjectMojo mojo) { assertNotNull(mojo); - assertNotNull(mojo.getSession()); + assertSame(session, mojo.getSession()); + assertSame(session, mojo.getSessionFromBean()); assertSame(project, mojo.getProject()); } } diff --git a/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/ProvidesInjectOverrideMojoTest.java b/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/ProvidesInjectOverrideMojoTest.java index a10c7b21..555dfd7f 100644 --- a/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/ProvidesInjectOverrideMojoTest.java +++ b/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/ProvidesInjectOverrideMojoTest.java @@ -69,6 +69,7 @@ public void bennShouldBeInjected(ProvidesInjectMojo mojo) { assertNotNull(mojo); // session provided by the @Provides method should be used assertSame(session, mojo.getSession()); + assertSame(session, mojo.getSessionFromBean()); assertSame(project, mojo.getProject()); } } diff --git a/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/TestBean.java b/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/TestBean.java new file mode 100644 index 00000000..ebd982b1 --- /dev/null +++ b/maven-plugin-testing-harness/src/test/java/org/apache/maven/plugin/testing/TestBean.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.maven.plugin.testing; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Provider; +import javax.inject.Singleton; + +import org.apache.maven.execution.MavenSession; + +@Named +@Singleton +public class TestBean { + private final Provider sessionProvider; + + @Inject + public TestBean(Provider sessionProvider) { + this.sessionProvider = sessionProvider; + } + + public MavenSession getSession() { + return sessionProvider.get(); + } +}