【问题标题】:Is there an interface in a third-party library to use for JUnit @Category()第三方库中是否有用于 JUnit @Category() 的接口
【发布时间】:2016-12-09 17:05:21
【问题描述】:

我的父 pom 包含定义 <groups><excludedGroups> 参数的 maven-surefire-pluginmaven-failsafe-plugin 配置如下使用我的接口 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>

【问题讨论】:

  • 那么问题是项目中的每个模块都必须有一个依赖才能拉入 com.adam.testutil.IntegrationTest 这里需要什么依赖?
  • 您能否详细介绍一下IntegrationTest 目前所在的位置以及您目前使用的模块结构?
  • 我改写了这个问题来回答你的问题。

标签: java maven integration-testing maven-surefire-plugin


【解决方案1】:

您的问题似乎表明IntegrationTest 接口的目的只是标记哪些测试由surefire 执行,哪些由failsafe 执行。

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

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

万无一失,the defaults are:

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

【讨论】:

  • 这是进行区分的一种基本方法,但实际上仅仅能够用适当的注释标记测试类就更有效了,就像一个类中的 JUnit 测试方法用@Test 注释。它更有效的原因 - 当你必须在一个领域实际上与测试有关的项目上工作时,如果你不得不担心你如何命名你的测试也是如此,这不仅仅是注释它更多的精神能量。
【解决方案2】:

如果..你的大部分模块需要..接口,你可以在一个单独的模块中声明你的IntegrationTest(虽然我建议不要只是一个单一的接口,而是尝试把相关的东西到那个接口以及这个模块)。让我们将其命名为 integration-test 以作为工件。

我更愿意将它声明为父 pom 中的依赖项,所以所有 模块会自动继承它,但这会创建一个循环 停止 mvn 运行的依赖问题。

  • 不必在父pom.xml 中声明依赖关系,尽管使用&lt;dependencyManagement&gt; 这样做可以更好地使用integration-test 维护的工件版本。 Read more about it in the doc

事实上,即使模块中没有单元测试或集成测试, 模块仍然需要声明依赖。

  • 如果是这种情况,您只需要在 pom.xml 中为此模块声明 integration-test 工件依赖项。

我还必须使模块包含 com.adam.testutil.IntegrationTest 构建顺序中的第一个模块, 否则它不会在任何新的首次安装中可用 系统

  • Reactor 排序负责在项目中构建模块的顺序,其中依赖模块是在成功构建它们所依赖的模块之后构建的。 You get to know more about it here. 因此,您的 integration-test 将在同一项目中依赖它的任何模块之前构建。

事实上我并不是特别想创建一个新模块只是为了 提供集成测试。如果 JUnit 有,那就简单多了 在库中包含一个合适的 org.junit.IntegrationTest 类。

那么在某个地方是否有一个方便的界面?我可以放一个 在我的父 pom 中依赖它,一切都会好起来的。

  • 除非您公开并证明IntegrationTest 接口的用途,否则我怀疑它是否可以包含在junit 库中。对于某个方便的界面也是如此,您的界面IntegrationTest正在尝试做什么以及是否值得将是最终问题。
  • 此后,如果可以将其包含(接受)到任何测试范围库中,那么您可以非常方便地将该库的依赖项导入您的父级 pom.xml
  • 在此之前,我仍然建议您使用 integration-test 单个模块方法。

【讨论】:

  • 当父 pom 中配置了 maven-surefire-plugin 和 maven-failsafe-plugin 时,您必须在所有模块的类路径中都有接口。感谢您对反应堆排序的参考。
猜你喜欢
  • 2015-04-09
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多