【问题标题】:run maven tests from classpath从类路径运行 Maven 测试
【发布时间】:2010-08-22 21:25:36
【问题描述】:

为了清理一大堆乱七八糟的东西,我开始将我的测试代码全部放在一个普通的 java 项目中(全部在 src/main/java 中),然后将其声明为 <scope>test</scope> 依赖项在另一个项目中,并期望测试能够运行。

没有这样的运气。 surefire 只想运行它可以在源代码中看到的测试。

我可以在这里看到一个非常明显的解决方案,其中涉及 build-helper-plugin 并将测试作为源目录添加到测试编译环境中,但我希望避免它。

如果有人想知道,这一切的原因是使用故障安全插件运行一些集成测试的 POM 配置变得非常复杂,以至于我想将测试类的编译与运行测试。

【问题讨论】:

    标签: maven-2 surefire


    【解决方案1】:

    现在可以使用 Maven Surefire v2.15。只需将以下类型的配置添加到 surefire 插件:

    <build>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.15</version>
        <configuration>
          <dependenciesToScan>
            <dependency>com.group.id:my-artifact</dependency>
            <dependency>com.group.id:my-other-artifact</dependency>
          </dependenciesToScan>
          ...
        </configuration>
        ...
      </plugin>
      ...
    </build>
    

    您还应该在依赖项部分声明实际的依赖项:

    <dependencies>
      <dependency>
        <groupId>com.group.id</groupId>
        <artifactId>my-artifact</artifactId>
        <type>test-jar</type>
        <version>1.1</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>com.group.id</groupId>
        <artifactId>my-other-artifact</artifactId>
        <type>test-jar</type>
        <version>1.1</version>
        <scope>test</scope>
      </dependency>
    </dependencies>
    

    【讨论】:

    • 您可能还需要 com.group.id:my-artifact “main jar”(不仅仅是 test-jar),否则这就像一个魅力
    【解决方案2】:

    没有这样的运气。 surefire 只想运行它可以在源代码中看到的测试。

    目前还不能开箱即用,surefire 只查看 target/test-classes 中的类:

    这实际上记录为SUREFIRE-569 - There should be a way to run unit tests from a dependency jar

    我可以在这里看到一个非常明显的解决方案,其中涉及 build-helper-plugin 并将测试作为源目录添加到测试编译环境中,但我希望避免它。

    当前的解决方法是在test 阶段之前使用dependency:unpack 将jar 解压到target/test-classes

    【讨论】:

    • 当我这样做时,我得到 org.junit.Assert 的 NoClassDefFound 错误!但这可能是其他东西的恶作剧。
    • @bmargulies 嗯……很奇怪。我不明白为什么你会得到那个 NoClassDefFoundError。我可能会尝试这个,但稍后。
    • 我提交了错误报告。我有一些想法,但我通过对类路径进行看似无关的调整让它消失了。它可能有 Eclipse 在错误的时刻写入类文件的结果。
    • @bmargulies:您在执行测试的工件中是否依赖于 junit? (不是您正在拆包的工件)
    • @sean 是的,当我遇到问题时我做了,并且 -X 在类路径中显示了它。然而,错误消息最终表明它实际上是在疯狂地寻找“Assert”而不是“org.junit.Assert”,所以我进行了一次清洁圣战,事情变得更好了。
    【解决方案3】:

    你不能反过来做吗?

    我的意思是把代码放在src/test/java,依赖你的主模块,在你的测试模块中运行测试?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      • 1970-01-01
      • 2011-01-11
      • 2011-01-06
      相关资源
      最近更新 更多