且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何使在Eclipse中运行JUnit测试的行为类似于在命令行上通过Maven运行测试

更新时间:2023-11-20 10:16:16

我准备了以下内容(灵感来自 user3254289的答案):

I prepared the following (inspired by user3254289's answer):

<dependency>
  <groupId>org.apache.maven.shared</groupId>
  <artifactId>maven-invoker</artifactId>
  <version>2.2</version>
</dependency>

已实施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

根据{workspace}/.metadata/.plugins/org.eclipse.debug.core/.launches/使用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>

请注意 VM参数中的关键部分:

-Dpom=${project_loc}/pom.xml -Dunit=${selected_resource_name}

完成所有这些设置后,我选择了一个JUnit类(当然不是MavenTestRunner, :-),并通过运行"图标()下拉列表.哎呀!就像一个魅力!

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!

唯一的缺点是不能通过资源的上下文菜单调用它.任何热衷于编写Eclipse插件的人吗?

The only shortcoming is that it can't be invoked via a resource's context menu. Anyone keen to write an Eclipse plugin?