I prepared the following (inspired by
user3254289's answer):
Extended the projects POM SO-30767338/pom.xml
<dependency>
<groupId>org.apache.maven.shared</groupId>
<artifactId>maven-invoker</artifactId>
<version>2.2</version>
</dependency>
Implemented SO-30767338/src/test/java/MavenTestRunner.java
import static java.lang.System.out;
import java.io.File;
import java.util.Collections;
import java.util.Properties;
import org.apache.maven.shared.invoker.*;
import org.junit.Test;
public class MavenTestRunner
{
@Test
public void testUnit()
{
String thisClassName = this.getClass().getSimpleName();
if ( System.getProperty( "unit" ).contains( thisClassName ) )
{
throw new IllegalArgumentException(
String.format( "%s cannot be tested with %1$s.", thisClassName ) );
}
Properties properties = new Properties();
properties.put( "test", System.getProperty( "unit" ) );
out.printf( "Testing %s in project %s.\n",
properties.getProperty( "test" ), System.getProperty( "pom" ) );
InvocationRequest request = new DefaultInvocationRequest();
request.setPomFile( new File( System.getProperty( "pom" ) ) );
request.setGoals( Collections.singletonList( "test" ) );
request.setProperties( properties );
try
{
Invoker invoker = new DefaultInvoker();
InvocationResult result = invoker.execute( request );
if ( result.getExitCode() != 0 )
{
throw new IllegalStateException(
String.format( "Test build of %s failed.", System.getProperty( "unit" ) ) );
}
}
catch ( MavenInvocationException e )
{
e.printStackTrace();
}
} // testUnit()
} // MavenTestRunner
Created a Run Configuration according to {workspace}/.metadata/.plugins/org.eclipse.debug.core/.launches/Test selected test unit with Maven.launch
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/SO-30767338/src/test/java/MavenTestRunner.java"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="1"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value="testUnit"/>
<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.m2e.launchconfig.classpathProvider"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="MavenTestRunner"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="SO-30767338"/>
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dpom=${project_loc}/pom.xml -Dunit=${selected_resource_name}"/>
</launchConfiguration>
Note the essential part in VM arguments:
-Dpom=${project_loc}/pom.xml -Dunit=${selected_resource_name}
After I had all this set up I selected a JUnit class (not MavenTestRunner,
of course :-) and invoked the run configuration created above via the Run icon's (
) dropdown list. Voilà! Like a charm!
The only shortcoming is that it can't be invoked via a resource's context menu. Anyone keen to write an Eclipse plugin?