Запуск тестов после упаковки

#unit-testing #maven #jar #package

#модульное тестирование #maven #jar #пакет

Вопрос:

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

Как мне сделать это с помощью Maven 2?

Комментарии:

1. Возможно, стоит взглянуть на Maven Failsafe Plugin — к сожалению, я никогда не использовал его сам и не могу предоставить больше информации по этому поводу.

Ответ №1:

Для этого вы можете использовать surefire-plugin. что вам нужно сделать, так это связать фазу с выполнением (см. Ниже). Вам нужно будет изменить фазу, чтобы она была такой, какой вы хотите, чтобы она была в вашем случае, через одну после фазы упаковки.

         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <skip>true</skip>
            </configuration>
            <executions>
                <execution>
                    <id>unittests</id>
                    <phase>test</phase>
                    <goals>
                        <goal>test</goal>
                    </goals>
                    <configuration>
                        <skip>false</skip>
                        <includes>
                            <include>**/**/**/*Test.java</include>
                        </includes>
                    </configuration>
                </execution>
            </executions>
        </plugin>
  

Комментарии:

1. Вы уверены, что упакованный файл jar будет находиться в пути к тестовому классу вместо скомпилированных классов?

2. @K. Clazen: да, так и будет. Запустите maven с -X аргументом для проверки пути к классу.

3. @Robert Munteanu После того, как Building jar: c:meworkspacesdefaultdo-nothing-projecttargetdo-nothing-project-0.0.1-SNAPSHOT.jar я получаю [DEBUG] Test Classpath : [DEBUG] c:meworkspacesdefaultdo-nothing-projecttargettest-classes [DEBUG] c:meworkspacesdefaultdo-nothing-projecttargetclasses [DEBUG] C:Usersme.m2repositoryjunitjunit4.8.2junit-4.8.2.jar — похоже, что скомпилированные классы находятся в classpath вместо jar.

4. @K. Classen : это были мои воспоминания, странно, что так не происходит…

5. Что вы хотите протестировать в файле jar? Является ли файл jar исполняемым? Не могли бы вы запустить файл jar и протестировать его в рабочем состоянии? Возможно, запустите скрипт через что-то вроде exec:exec и проверьте содержимое jar.

Ответ №2:

Преобразуйте свой проект в многомодульную сборку. В первом модуле создайте свой оригинальный проект. Во втором модуле добавьте зависимость к первому.

Это добавит первый JAR в путь к классу.


Обновление от OP: Это работает, но мне пришлось добавить это в мой POM:

     <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${version.maven-surefire-plugin}</version>
            <configuration>
                <useSystemClassLoader>false</useSystemClassLoader>
            </configuration>
        </plugin>
  

Важная часть заключается в <useSystemClassLoader>false</useSystemClassLoader> . Без этого мой classpath содержал только пару файлов виртуальной машины плюс файл surefire bootstrap JAR (который содержит путь к тестовому классу в MANIFEST.MF ). Я понятия не имею, почему этот тестовый путь к классу не виден из загруженных из него классов.

Комментарии:

1. тест-артефакт? Вы имеете в виду другой модуль?

2. ДА. Дополнительный артефакт, который потребует недавней сборки вашей библиотеки из репозитория и выполняет проверки на ней.