Хобрук: Ваш путь к мастерству в программировании

Выполнение модульных тестов Maven с указанием пути к классам для сгенерированного проекта JAR

Некоторые модульные тесты в моем приложении связаны с поиском и управлением определенными файловыми ресурсами, которые являются частью самого приложения. Мне нужно, чтобы эти тесты выполнялись в реальной производственной среде приложения, где оно развернуто в виде файла JAR, а не в виде развернутого каталога.

Как я могу поручить Maven выполнять мои модульные тесты, рассматривая в качестве пути к классам сгенерированный проектом файл jar (и любые другие объявленные зависимости библиотеки) вместо скомпилированных классов в файловой системе, как это делается по умолчанию?

Другими словами, прямо сейчас для моих модульных тестов задан путь к классам: /$PROJECTPATH/target/classes/.

Вместо этого я бы хотел, чтобы этот путь к классам был установлен на: /$PROJECTPATH/target/myjarfile.jar.

Я пытался вручную добавлять и удалять классы зависимостей, как описано здесь: http://maven.apache.org/plugins/maven-surefire-plugin/examples/configuring-classpath.html, но до сих пор это не работает.

Мой текущий проект POM выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.mygroupid</groupId>
  <artifactId>myartifact</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <dependencies>
      ...
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.1</version>
        <configuration>
        <source>1.7</source>
        <target>1.7</target>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <version>2.1.2</version> 
        <executions>
          <execution>
            <id>attach-sources</id>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.4</version>

        <configuration>
              <includeScope>runtime</includeScope>
              <outputDirectory>${project.build.directory}/lib</outputDirectory>
        </configuration>

        <executions>
          <execution> 
            <id>copy-dependencies</id>
            <phase>process-resources</phase>
            <!-- <phase>package</phase>  -->
            <goals>
              <goal>copy-dependencies</goal>
            </goals>

          </execution>
        </executions>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.12.3</version>
        <configuration>
              <classpathDependencyExcludes>
                <classpathDependencyExclude>
                  ${project.build.outputDirectory}
                </classpathDependencyExclude>
              </classpathDependencyExcludes>

              <additionalClasspathElements>
                <additionalClasspathElement>
              ${project.build.directory}/${project.build.finalName}.${project.packaging}
                </additionalClasspathElement>
              </additionalClasspathElements>
        </configuration>
      </plugin>

    </plugins>

  </build>
</project>

Заранее благодарю за любую помощь!.

30.08.2012

  • Этот вопрос может быть полезен: stackoverflow.com/questions/1401857/. Требование отличается (тем, что OP специально хочет, чтобы JAR-файлы были вне пути к классам), но, возможно, оно даст некоторые подсказки. 30.08.2012
  • Вы решили эту проблему? 07.11.2016

Ответы:


1

Стандартные модульные тесты, выполняемые как часть фазы жизненного цикла теста, не могут видеть JAR-файл проекта, поскольку фаза test выполняется до фазы package, поэтому ваши тесты запускаются до того, как Maven создаст JAR-файл. На на этой странице приведен список фаз жизненного цикла и их заказ.

Что вы хотите, чтобы он запускал ваши тесты как интеграционные тесты, которые выполняются на этапе integration-test.

Существует ряд руководств по настройке Maven для запуска интеграционных тестов. здесь и вот несколько примеров для начинающих. безопасный подключаемый модуль обычно используется для выполнения интеграции. тесты.

Я не могу точно вспомнить, используют ли интеграционные тесты target/classes или JAR-файл вашего проекта в пути к классам. Но если это не так, вы всегда можете создать другой проект Maven, добавить туда свои тесты и добавить основной проект в качестве зависимости от этого проекта интеграционного теста. В некоторых случаях это может быть предпочтительнее использования фазы интеграционного тестирования в основном проекте, если это не просто стандартная библиотека Java, например, если вы пишете процессор аннотаций.

30.08.2012
  • +1 спасибо за разъяснения, но эта простая проблема становится сложнее, чем я ожидал. Один вопрос, ваш ответ объясняет, почему банку нельзя ДОБАВИТЬ в путь к классам, но не объясняет, почему ${project.build.outputDirectory} не исключен из пути к классам (тесты проходят успешно с использованием этого пути к классам), что-то не так с мои элементы classpathDependencyExclude? 31.08.2012
  • ClasspathDependencyExcludes исключает только зависимости и принимает форму groupId:artifactId. Это может сработать, если вы установите параметр конфигурации плагина classesDirectory, который по умолчанию равен ${project.build.outputDirectory}, для какого-то другого несуществующего каталога, чтобы ваш каталог классов не был включен в путь к классам. 31.08.2012
  • Новые материалы

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

    Обзор 20 основных и современных методов работы с массивами в JavaScript
    Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

    Да, но я чувствую необходимость указать, что это или не единственные два.
    Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.