Как заставить запуск теста JUnit в Eclipse вести себя как запуск теста через Maven в командной строке

Я использую Eclipse Kepler и Maven 3.2.3. Я импортировал свои проекты с помощью плагина M2Eclipse. Обычно, когда я запускаю тест JUnit в командной строке, например

mvn clean test -Dtest=MyJunitTest

есть некоторые вещи, которые выполняются на этапах «процесс-ресурсы» и «процесс-классы» до того, как мой тест будет выполнен. В Eclipse, когда я открываю тестовый файл JUnit в редакторе, щелкните правой кнопкой мыши имя класса (например, «MyJUnitTest») и щелкните правой кнопкой мыши «Запуск от имени» и «JUnit Test», эти фазы, похоже, не запускаются. Итак, мой вопрос: как я могу щелкнуть правой кнопкой мыши мой тест Junit и выбрать «Запуск от имени» -> «Тест JUnit», чтобы он вел себя так, как если бы я набрал «mvn clean test -Dtest = MyJunitTest» в командной строке?


person Dave    schedule 10.06.2015    source источник


Ответы (2)


Я подготовил следующее (вдохновленный ответом user3254289):

Расширены проекты POM SO-30767338/pom.xml

<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/Test выбранного тестового модуля с помощью 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>

Обратите внимание на важную часть аргументов виртуальной машины:

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

После того, как я все это настроил, я выбрал класс JUnit (не MavenTestRunner,, конечно :-) и вызвал конфигурацию запуска, созданную выше, с помощью значка «Выполнить» (). Вуаля! Как колдовство!

Единственным недостатком является то, что его нельзя вызвать через контекстное меню ресурса. Кто-нибудь хочет написать плагин Eclipse?

person Gerold Broser    schedule 11.06.2015
comment
Привет. Ясно, вы щелкнули правой кнопкой мыши имя класса JUnit, выбрали «Конфигурации запуска», а затем вызвали конфигурацию запуска, указанную выше, и что это? - person Dave; 12.06.2015
comment
@ Дэйв Нет. Создайте конфигурацию запуска в соответствии с файлом Test selected test unit with Maven.launch в моем ответе. Затем щелкните левой кнопкой мыши (=select) имя класса JUnit → выберите зелено-белый значок конфигурации запуска (›) раскрывающееся меню → Выберите Test selected test unit with Maven. - person Gerold Broser; 12.06.2015

Maven и JUnit — это два совершенно разных инструмента, каждый из которых имеет свой путь сборки-запуска и предъявляет разные требования. Тот факт, что Maven может использовать JUnit как часть своей цепочки инструментов, не означает, что они одинаковы!

Очевидно, вы сделали свой проект зависимым от пути сборки Maven. Было бы чрезвычайно сложно, а может быть, и невозможно заставить JUnit следовать по этому пути.

В Eclipse с подключаемым модулем m2e тривиально создавать собственные запуски, используя сборку Run As > Maven. При необходимости доступна документация .

Эта опция «сборка Maven» доступна только на верхнем уровне вашего проекта, где находится ваш pom. Затем вам нужно будет указать все ваши параметры, такие как -Dtest=MyJunitTest.

person SiKing    schedule 10.06.2015
comment
Я знаю, что это сложно, поэтому и задал вопрос! Когда я щелкаю правой кнопкой мыши имя класса теста Junit в файле JUnit и выбираю «Запуск от имени», нет опции сборки Maven, только «Запуск на сервере», «Тест Junit» и «Запуск конфигураций». - person Dave; 11.06.2015