Class MojoExtension
java.lang.Object
org.apache.maven.api.di.testing.MavenDIExtension
org.apache.maven.api.plugin.testing.MojoExtension
- All Implemented Interfaces:
org.junit.jupiter.api.extension.AfterEachCallback
,org.junit.jupiter.api.extension.BeforeEachCallback
,org.junit.jupiter.api.extension.Extension
,org.junit.jupiter.api.extension.ParameterResolver
,org.junit.jupiter.api.extension.TestInstantiationAwareExtension
public class MojoExtension
extends MavenDIExtension
implements org.junit.jupiter.api.extension.ParameterResolver, org.junit.jupiter.api.extension.BeforeEachCallback
JUnit Jupiter extension that provides support for testing Maven plugins (Mojos).
This extension handles the lifecycle of Mojo instances in tests, including instantiation,
configuration, and dependency injection.
The extension is automatically registered when using the MojoTest
annotation
on a test class. It provides the following features:
- Automatic Mojo instantiation based on
InjectMojo
annotations - Parameter injection using
MojoParameter
annotations - POM configuration handling
- Project stub creation and configuration
- Maven session and build context setup
- Component dependency injection
Example usage in a test class:
@MojoTest
class MyMojoTest {
@Test
@InjectMojo(goal = "my-goal")
@MojoParameter(name = "outputDirectory", value = "${project.build.directory}/generated")
void testMojoExecution(MyMojo mojo) throws Exception {
mojo.execute();
// verify execution results
}
}
The extension supports two main injection scenarios:
- Method parameter injection: Mojo instances can be injected as test method parameters
- Field injection: Components can be injected into test class fields using
@Inject
For custom POM configurations, you can specify a POM file using the InjectMojo.pom()
attribute. The extension will merge this configuration with default test project settings.
Base directory handling:
- Plugin basedir: The directory containing the plugin project
- Test basedir: The directory containing test resources, configurable via
Basedir
- Since:
- 4.0.0
- See Also:
-
Nested Class Summary
Nested classes/interfaces inherited from interface org.junit.jupiter.api.extension.TestInstantiationAwareExtension
org.junit.jupiter.api.extension.TestInstantiationAwareExtension.ExtensionContextScope
-
Field Summary
FieldsModifier and TypeFieldDescriptionprotected static String
The base directory for test resourcesprotected static String
The base directory of the plugin being testedFields inherited from class org.apache.maven.api.di.testing.MavenDIExtension
context, injector
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoid
beforeEach
(org.junit.jupiter.api.extension.ExtensionContext context) Initializes the test environment before each test method execution.static XmlNode
extractPluginConfiguration
(String artifactId, org.codehaus.plexus.util.xml.Xpp3Dom pomDom) static String
Gets the base directory for test resources.static String
Gets the base directory of the plugin being tested.protected String
static String
Gets the identifier for the current test method.getVariablesAndValuesFromObject
(Class<?> clazz, Object object) Convenience method to obtain all variables and values from the mojo (including its superclasses)
Note: the values in the map are of type Object so the caller is responsible for casting to desired types.Convenience method to obtain all variables and values from the mojo (including its superclasses)
Note: the values in the map are of type Object so the caller is responsible for casting to desired types.static Object
getVariableValueFromObject
(Object object, String variable) Convenience method to obtain the value of a variable on a mojo that might not have a getter.protected String[]
mojoCoordinates
(String goal) resolveParameter
(org.junit.jupiter.api.extension.ParameterContext parameterContext, org.junit.jupiter.api.extension.ExtensionContext extensionContext) static void
setVariableValueToObject
(Object object, String variable, Object value) Convenience method to set values to variables in objects that don't have settersboolean
supportsParameter
(org.junit.jupiter.api.extension.ParameterContext parameterContext, org.junit.jupiter.api.extension.ExtensionContext extensionContext) Determines if this extension can resolve the given parameter.Methods inherited from class org.apache.maven.api.di.testing.MavenDIExtension
afterEach, getInjector, getTestFile, getTestFile, getTestPath, getTestPath, lookup, lookup, lookup, release, setContext, setupContainer
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface org.junit.jupiter.api.extension.TestInstantiationAwareExtension
getTestInstantiationExtensionContextScope
-
Field Details
-
pluginBasedir
The base directory of the plugin being tested -
basedir
The base directory for test resources
-
-
Constructor Details
-
MojoExtension
public MojoExtension()
-
-
Method Details
-
getTestId
Gets the identifier for the current test method. The format is "TestClassName-testMethodName".- Returns:
- the test identifier
-
getBasedir
Gets the base directory for test resources. If not explicitly set viaBasedir
, returns the plugin base directory.- Returns:
- the base directory path
- Throws:
NullPointerException
- if neither basedir nor plugin basedir is set
-
getPluginBasedir
Gets the base directory of the plugin being tested.- Returns:
- the plugin base directory path
- Throws:
NullPointerException
- if plugin basedir is not set
-
supportsParameter
public boolean supportsParameter(org.junit.jupiter.api.extension.ParameterContext parameterContext, org.junit.jupiter.api.extension.ExtensionContext extensionContext) throws org.junit.jupiter.api.extension.ParameterResolutionException Determines if this extension can resolve the given parameter. Returns true if the parameter is annotated withInjectMojo
or if its declaring method is annotated withInjectMojo
.- Specified by:
supportsParameter
in interfaceorg.junit.jupiter.api.extension.ParameterResolver
- Parameters:
parameterContext
- the context for the parameter being resolvedextensionContext
- the current extension context- Returns:
- true if this extension can resolve the parameter
- Throws:
org.junit.jupiter.api.extension.ParameterResolutionException
-
resolveParameter
public Object resolveParameter(org.junit.jupiter.api.extension.ParameterContext parameterContext, org.junit.jupiter.api.extension.ExtensionContext extensionContext) throws org.junit.jupiter.api.extension.ParameterResolutionException - Specified by:
resolveParameter
in interfaceorg.junit.jupiter.api.extension.ParameterResolver
- Throws:
org.junit.jupiter.api.extension.ParameterResolutionException
-
beforeEach
Description copied from class:MavenDIExtension
Initializes the test environment before each test method execution. Sets up the base directory and DI container, then performs injection into the test instance.- Specified by:
beforeEach
in interfaceorg.junit.jupiter.api.extension.BeforeEachCallback
- Overrides:
beforeEach
in classMavenDIExtension
- Parameters:
context
- The extension context provided by JUnit- Throws:
Exception
- if initialization fails
-
getPluginDescriptorLocation
-
mojoCoordinates
-
extractPluginConfiguration
-
getVariableValueFromObject
public static Object getVariableValueFromObject(Object object, String variable) throws IllegalAccessException Convenience method to obtain the value of a variable on a mojo that might not have a getter.
NOTE: the caller is responsible for casting to what the desired type is.- Throws:
IllegalAccessException
-
getVariablesAndValuesFromObject
public static Map<String,Object> getVariablesAndValuesFromObject(Object object) throws IllegalAccessException Convenience method to obtain all variables and values from the mojo (including its superclasses)
Note: the values in the map are of type Object so the caller is responsible for casting to desired types.- Throws:
IllegalAccessException
-
getVariablesAndValuesFromObject
public static Map<String,Object> getVariablesAndValuesFromObject(Class<?> clazz, Object object) throws IllegalAccessException Convenience method to obtain all variables and values from the mojo (including its superclasses)
Note: the values in the map are of type Object so the caller is responsible for casting to desired types.- Returns:
- map of variable names and values
- Throws:
IllegalAccessException
-
setVariableValueToObject
public static void setVariableValueToObject(Object object, String variable, Object value) throws IllegalAccessException Convenience method to set values to variables in objects that don't have setters- Throws:
IllegalAccessException
-