Где я должен разместить класс интерфейса для Junit @Category?

Я хотел бы определить интерфейсы для всего проекта, которые будут использоваться в @Category аннотациях, и настроить Maven для исключения их аннотированных тестов при построении всего проекта.

В проекте application есть тест, который я бы хотел классифицировать:

@Category(Integration.class)
@Test
public void testExternalResource() { ... }

Настройка:

Я создал многомодульный проект maven:

/container (has a pom with <modules> element)
    /parent (all other modules inherit from its pom. has no source, only pom)
    /util (other modules are depending on it)
    /infra
    /application (depending on infra and util, inherits from parent)

Будучи помешанным на инфраструктуре :), я хотел бы настроить весь свой проект, чтобы исключить группы в любом модуле. Итак, в модуле parent я определил:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.16</version>
    <configuration>
         <excludedGroups>com.mycompany.test.Integration</excludedGroups>
    </configuration>
</plugin>

И я поместил интерфейс Integration в модуль utilutil/src/test/java), чтобы все модули видели:

package com.mycompany.test;
public interface Integration {}

И поскольку это test-jar, я правильно настроил оба утилита и приложение .

Ошибка:

При запуске mvn clean install я получаю

[ERROR] Failed to execute goal org.apache.maven.plugins:
    maven-surefire-plugin:2.16:test
    (default-test) on project util: Execution default-test of goal
    org.apache.maven.plugins:maven-surefire-plugin:2.16:test
    failed: There was an error in the forked process
[ERROR] java.lang.RuntimeException:
    Unable to load category: com.mycompany.test.Integration

Ну, конечно, класс недоступен - я запихал его в тест-банку в первом модуле проекта. :(

Где мне разместить интерфейс Integration, чтобы он был доступен для моей конфигурации mvn и моего исходного кода?


person Asaf    schedule 14.11.2013    source источник


Ответы (1)


Создайте новый модуль Maven и поместите интерфейс под src/main/java/. Убедитесь, что junit доступен как зависимость времени компиляции (<scope>compile</scope>) — вы в основном создаете зависимость, которую могут использовать другие тесты. Таким образом, ваш код, который помогает другим тестам, должен перейти в main, а тесты для этого — в src/test/java, как обычно.

Этот шаг кажется немного странным, но подумайте о том, как бы вы упаковали сам junit. С точки зрения junit это обычная библиотека Java, поэтому весь ее код помещается в main.

Когда вам понадобится этот модуль, используйте его как тестовую зависимость с <scope>test</scope>

person Aaron Digulla    schedule 14.11.2013
comment
Это, конечно, требует, чтобы этот новый модуль не наследовался от родительского модуля, который его использует? я попробую это - person Asaf; 14.11.2013
comment
У вас может быть циклическая зависимость с родительским POM. Для этого родительский POM должен иметь <packaging>pom</packaging>, что означает, что он фактически не пытается загрузить зависимости, которые вы там определяете. Если родительский POM фактически предназначен для основного кода, создайте второй проект Maven. - person Aaron Digulla; 14.11.2013
comment
родитель: не имеет источника, упаковка pom - person Asaf; 14.11.2013