我的父pom包含maven-surefire-pluginmaven-failsafe-plugin配置,这些配置使用JUnit 4 <groups>批注的接口<excludedGroups>如下定义com.adam.testutil.IntegrationTest@Category参数,以将任何测试标记为集成测试。

父pom下的所有模块(不仅仅是具有集成测试的模块)都将在其类路径上要求com.adam.testutil.IntegrationTest,以便surefire和failsafe插件运行,否则会抛出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>

最佳答案

您的问题似乎暗示IntegrationTest接口的目的仅仅是标记那些由surefire执行的测试和哪些由故障安全执行的测试。

在这种情况下,您可以使用命名约定。
故障安全的默认值为
described in the docs

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


对于surefire,the defaults are

<includes>
    <include>**/Test*.java</include>
    <include>**/*Test.java</include>
    <include>**/*TestCase.java</include>
</includes>

10-06 02:17