Есть ли интерфейс в сторонней библиотеке для использования JUnit @Category()

Мой родительский pom содержит конфигурации maven-surefire-plugin и maven-failsafe-plugin, определяющие параметры <groups> и <excludedGroups>, как показано ниже, с использованием моего интерфейса com.adam.testutil.IntegrationTest для аннотации JUnit 4 @Category, чтобы пометить любой тест как интеграционный.

Все модули в родительском pom (не только с интеграционными тестами) потребуют com.adam.testutil.IntegrationTest в своем пути к классам, чтобы запускались надёжные и отказоустойчивые плагины, в противном случае они выдают ошибку ClassNotFoundException.

Таким образом, класс должен находиться в модуле, который все модули должны объявлять как зависимость. Я бы предпочел объявить его как зависимость в родительском pom, чтобы все модули наследуют его автоматически, но это создаст проблему циклической зависимости, которая остановит работу mvn.

На самом деле, даже если в модуле нет модульных или интеграционных тестов, модуль все равно должен объявить зависимость.

Я также должен сделать модуль, содержащий com.adam.testutil.IntegrationTest, первым модулем в порядке сборки, иначе он не будет доступен при первой установке на новых системах. У меня возникает дилемма курицы и яйца: я не могу просто запустить mvn install в пустом репозитории, потому что зависимости с IntegrationTest еще нет в локальном репозитории.

На самом деле я не особенно хочу создавать новый модуль только для предоставления IntegrationTest. Было бы намного проще, если бы JUnit включил в библиотеку подходящий класс org.junit.IntegrationTest.

Хотя я думаю, что @Cateogry — отличный способ аннотировать тесты, чтобы пометить их как интеграционные, в многомодульном проекте у него есть все эти недостатки.

Есть ли подходящий интерфейс или интерфейс с подходящим названием, который я мог бы использовать вместо того, чтобы иметь свой собственный?

В худшем случае, что касается JUnit, @Category, maven-surefire-plugin и maven-failsafe-plugin, я мог бы использовать интерфейс в JDK, например. java.lang.Cloneable — хотя любой, кто читает код, задается вопросом, что, черт возьми, происходит.

Я надеялся, что в JUnit что-то есть, но не нашел ничего полезного.

Я мог бы просто поставить зависимость от сторонней библиотеки в своем родительском pom, и все было бы хорошо.

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

import org.junit.experimental.categories.Category
import com.adam.testutil.IntegrationTest

@Category(IntegrationTest.class)
public DbAndJpaIntegrationTests {
    ...
}

.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <configuration>
        <excludedGroups>com.bp.gis.util.HeavyTest
        </excludedGroups>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.18.1</version>
    <configuration>
        <includes>
            <include>**/*.java</include>
        </includes>
        <groups>com.bp.gis.util.HeavyTest</groups>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>integration-test</goal>
            </goals>
        </execution>
    </executions>
</plugin>

person Adam    schedule 09.12.2016    source источник
comment
Тогда проблема заключается в том, что каждый модуль в проекте должен иметь зависимость для получения com.adam.testutil.IntegrationTest. Какая здесь требуется зависимость?   -  person Naman    schedule 09.12.2016
comment
Не могли бы вы также предоставить подробную информацию о том, где в настоящее время находится IntegrationTest и какая структура вашего модуля используется на данный момент?   -  person Naman    schedule 09.12.2016
comment
Я перефразировал вопрос, чтобы ответить на ваши вопросы.   -  person Adam    schedule 10.12.2016


Ответы (2)


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

В этом случае вы можете использовать соглашение об именах. По умолчанию для отказоустойчивости используется описанный в документации< /а>:

<includes>
    <include>**/IT*.java</include>
    <include>**/*IT.java</include>
    <include>**/*ITCase.java</include>
</includes>

Для surefire по умолчанию:

<includes>
    <include>**/Test*.java</include>
    <include>**/*Test.java</include>
    <include>**/*TestCase.java</include>
</includes>
person kewne    schedule 10.12.2016
comment
Это основной способ сделать различие, но на самом деле гораздо эффективнее просто иметь возможность помечать тестовые классы соответствующей аннотацией, подобно тому, как тестовые методы JUnit в классе помечаются аннотацией @Test. Причина, по которой это более эффективно - когда вам нужно работать над проектом, где предметная область на самом деле как-то связана с тестированием, а слово test распространяется среди множества имен классов, если вам нужно беспокоиться о том, как вы называете свои тесты как Ну, это больше умственной энергии, чем просто аннотирование. - person Adam; 11.12.2016

Если ...большинству вашего модуля требуется... интерфейс, вы можете объявить свой IntegrationTest в отдельном модуле (хотя я бы предложил не только один интерфейс, но и попытаться поместить вещи, связанные с этим интерфейсом, а также в этот модуль). Назовем его именем integration-test для артефакта.

Я бы предпочел объявить его как зависимость в родительском pom, чтобы все модули наследуют его автоматически, но это создаст проблему циклической зависимости, которая остановит работу mvn.

  • Не обязательно объявлять зависимость в родительском pom.xml, хотя использование <dependencyManagement> может означать лучшее использование integration-test поддерживаемых версий артефакта. Подробнее об этом читайте в документе.

На самом деле, даже если в модуле нет модульных или интеграционных тестов, модуль все равно должен объявить зависимость.

  • Если это так, вам просто не нужно объявлять зависимость артефакта integration-test в pom.xml для этого модуля.

Я также должен сделать модуль, содержащий com.adam.testutil.IntegrationTest, первым модулем в порядке сборки, иначе он не будет доступен при первой установке на любых новых системах.

  • Сортировка Reactor заботится о порядке сборки модулей в проекте, в котором зависимые модули собираются после успешной сборки модулей, от которых они зависят. Вы можете узнать больше об этом здесь. Итак, ваш integration-test будет строиться до любого модуля в том же проекте, который зависит от него.

На самом деле я не особенно хочу создавать новый модуль только для обеспечения IntegrationTest. Было бы намного проще, если бы JUnit включил в библиотеку подходящий класс org.junit.IntegrationTest.

Так есть ли где-нибудь удобный интерфейс? Я могу просто поставить зависимость от него в своем родительском помпе, и все будет хорошо.

  • Если вы не раскроете и не докажете, для чего полезен интерфейс IntegrationTest, я сомневаюсь, что его можно будет включить в библиотеку junit. И то же самое для удобного интерфейса где-то там, что ваш интерфейс IntegrationTest пытается сделать и стоит ли это, будет окончательным вопросом.
  • После этого, если есть возможность быть включенным (принятым) в любую из библиотек области тестирования, вам может быть очень удобно импортировать зависимость этой библиотеки в родительскую pom.xml.
  • До тех пор я бы все же посоветовал вам использовать подход с отдельными модулями integration-test.
person Naman    schedule 10.12.2016
comment
У вас должен быть интерфейс в пути к классам во всех модулях, когда maven-surefire-plugin и maven-failsafe-plugin настроены в родительском pom со ссылкой. Спасибо за ссылку на сортировку реакторов. - person Adam; 11.12.2016