diff --git a/pom.xml b/pom.xml index 8ea3462..64d3356 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ plexus-testing - 1.6.2-SNAPSHOT + 1.7.0-SNAPSHOT Plexus Testing Library to help testing plexus components @@ -36,7 +36,7 @@ 0.9.0.M4 - 2025-10-11T14:58:36Z + 2025-10-13T21:13:09Z @@ -72,6 +72,19 @@ org.junit.jupiter junit-jupiter-api + + + org.mockito + mockito-core + 4.11.0 + test + + + org.mockito + mockito-junit-jupiter + 4.11.0 + test + diff --git a/src/main/java/org/codehaus/plexus/testing/PlexusExtension.java b/src/main/java/org/codehaus/plexus/testing/PlexusExtension.java index b344041..b4b84e1 100644 --- a/src/main/java/org/codehaus/plexus/testing/PlexusExtension.java +++ b/src/main/java/org/codehaus/plexus/testing/PlexusExtension.java @@ -58,7 +58,7 @@ * This is a slightly modified version of the original plexus class * available at https://raw.githubusercontent.com/codehaus-plexus/plexus-containers/master/plexus-container-default/ * src/main/java/org/codehaus/plexus/PlexusTestCase.java - * in order to migrate the tests to JUnit 4. + * in order to migrate the tests to JUnit 5. * * @author Jason van Zyl * @author Trygve Laugstøl @@ -94,7 +94,6 @@ protected void setContext(ExtensionContext context) { this.context = context; } - @SuppressWarnings("ResultOfMethodCallIgnored") protected void setupContainer() { // ---------------------------------------------------------------------------- // Context Setup @@ -136,12 +135,14 @@ protected void setupContainer() { } customizeContainerConfiguration(containerConfiguration); + testInstanceCustomizeContainerConfiguration(containerConfiguration); try { container = new DefaultPlexusContainer(containerConfiguration); } catch (PlexusContainerException e) { throw new IllegalArgumentException("Failed to create plexus container.", e); } + testInstanceCustomizeContainer(container); } /** @@ -155,6 +156,20 @@ protected void customizeContainerConfiguration(ContainerConfiguration containerC containerConfiguration.setClassPathScanning(PlexusConstants.SCANNING_INDEX); } + private void testInstanceCustomizeContainerConfiguration(ContainerConfiguration containerConfiguration) { + Object testInstance = context.getRequiredTestInstance(); + if (testInstance instanceof PlexusTestConfiguration) { + ((PlexusTestConfiguration) testInstance).customizeConfiguration(containerConfiguration); + } + } + + private void testInstanceCustomizeContainer(PlexusContainer container) { + Object testInstance = context.getRequiredTestInstance(); + if (testInstance instanceof PlexusTestConfiguration) { + ((PlexusTestConfiguration) testInstance).customizeContainer(container); + } + } + protected void customizeContext(Context context) {} protected PlexusConfiguration customizeComponentConfiguration() { diff --git a/src/main/java/org/codehaus/plexus/testing/PlexusTestConfiguration.java b/src/main/java/org/codehaus/plexus/testing/PlexusTestConfiguration.java new file mode 100644 index 0000000..7707902 --- /dev/null +++ b/src/main/java/org/codehaus/plexus/testing/PlexusTestConfiguration.java @@ -0,0 +1,28 @@ +package org.codehaus.plexus.testing; + +import org.codehaus.plexus.ContainerConfiguration; +import org.codehaus.plexus.PlexusContainer; + +/** + * Allow to customize the Plexus container by test class. + * + * @since 1.7.0 + */ +public interface PlexusTestConfiguration { + + /** + * Customize the container configuration before the container is created. + * + * @param containerConfiguration the container configuration to customize + * @since 1.7.0 + */ + default void customizeConfiguration(ContainerConfiguration containerConfiguration) {} + + /** + * Customize the container after it has been created. + * + * @param container the container to customize + * @since 1.7.0 + */ + default void customizeContainer(PlexusContainer container) {} +} diff --git a/src/site/markdown/index.md b/src/site/markdown/index.md index 27da2b2..719b5d0 100644 --- a/src/site/markdown/index.md +++ b/src/site/markdown/index.md @@ -8,6 +8,14 @@ Library to help testing plexus components +### Customization of the Plexus Container + +Test class can customize the Plexus Container used for testing by implementing +the [`PlexusTestConfiguration`](apidocs/org/codehaus/plexus/testing/PlexusTestConfiguration.html). +All methods have default empty implementations so you can implement only the ones you need. + + + ### Used classes in test diff --git a/src/test/java/org/codehaus/plexus/testing/PlexusTestCustomizeTest.java b/src/test/java/org/codehaus/plexus/testing/PlexusTestCustomizeTest.java new file mode 100644 index 0000000..6e5af9c --- /dev/null +++ b/src/test/java/org/codehaus/plexus/testing/PlexusTestCustomizeTest.java @@ -0,0 +1,66 @@ +package org.codehaus.plexus.testing; + +/* + * 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. + */ +// START SNIPPET: test-customize-class +import javax.inject.Inject; + +import org.codehaus.plexus.PlexusContainer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; + +// MockitoExtension must be first +@ExtendWith(MockitoExtension.class) +@PlexusTest +class PlexusTestCustomizeTest implements PlexusTestConfiguration { + + @Mock + private TestJavaxComponent2 mockComponent2; + + /* + Customize the container configuration before it is used to create the container. + + Method has default empty implementation so not need to implement if not used. + + @Override + public void customizeConfiguration(ContainerConfiguration containerConfiguration) { + + } + */ + + @Override + public void customizeContainer(PlexusContainer container) { + container.addComponent(mockComponent2, TestJavaxComponent2.class.getName()); + } + + @Inject + private TestJavaxComponent testJavaxComponent; + + @Test + void dependencyShouldBeInjected() { + assertNotNull(testJavaxComponent); + assertSame(testJavaxComponent.getTestComponent2(), mockComponent2); + } +} +// END SNIPPET: test-customize-class