Surefire没有拿起Junit 4测试

2022-09-01 01:46:40

由于某种原因,我无法让Maven 2 Surefire插件来执行JUnit 4测试类。

public class SimpleTest {
  @org.junit.Test
  public void simple() {
     System.out.println("foo");
  }
}

但是,如果我将此类更改为JUnit-3,例如

public class SimpleTest extends junit.framework.TestCase {
  public void testBar() {
     System.out.println("bar");
  }

  @org.junit.Test
  public void simple() {
     System.out.println("foo");
  }
}

然后它被执行。以下是我所做的:

  • 已验证的 Maven 版本: Apache Maven 2.2.1 (r801777; 2009-08-06 20:16:01+0100)
  • 已验证 Surefire 版本:遵循建议
  • 已验证 Surefire 版本:检查了我的 Surefire jars - 它们都是版本 2.4.2 或 2.4.3~/.m2/repository/org/apache/maven/surefire
  • 做了一个确保我只依赖 junit 版本 4.7mvn dependency:tree | grep junit

我遇到此问题的模块没有JUnit 3测试。

还有什么我错过的吗?


答案 1

mvn -X帮助我揭示了以下内容:

...
[INFO] [surefire:test {execution: default-test}]
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG]   org.apache.maven.surefire:surefire-booter:jar:2.4.3:runtime (selected for runtime)
[DEBUG]     org.apache.maven.surefire:surefire-api:jar:2.4.3:runtime (selected for runtime)
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/apache/maven/surefire/surefire-booter/2.4.3/surefire-booter-2.4.3.jar
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/apache/maven/surefire/surefire-api/2.4.3/surefire-api-2.4.3.jar
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG]   org.testng:testng:jar:jdk15:5.8:test (selected for test)
[DEBUG]     junit:junit:jar:3.8.1:test (selected for test)
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/testng/testng/5.8/testng-5.8-jdk15.jar
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/junit/junit/3.8.1/junit-3.8.1.jar
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG] Retrieving parent-POM: org.apache.maven.surefire:surefire-providers:pom:2.4.3 for project: null:surefire-testng:jar:null from the repository.
[DEBUG] Adding managed dependencies for unknown:surefire-testng
[DEBUG]   org.apache.maven.surefire:surefire-api:jar:2.4.3
[DEBUG]   org.apache.maven.surefire:surefire-booter:jar:2.4.3
[DEBUG]   org.codehaus.plexus:plexus-utils:jar:1.5.1
[DEBUG]   org.apache.maven.surefire:surefire-testng:jar:2.4.3:test (selected for test)
[DEBUG]     org.apache.maven:maven-artifact:jar:2.0:test (selected for test)
[DEBUG]       org.codehaus.plexus:plexus-utils:jar:1.0.4:test (selected for test)
[DEBUG]     junit:junit:jar:3.8.1:test (selected for test)
[DEBUG]     org.testng:testng:jar:jdk15:5.7:test (selected for test)
[DEBUG]     org.apache.maven.surefire:surefire-api:jar:2.4.3:test (selected for test)
...
[DEBUG] Test Classpath :
...
[DEBUG]   /home/mindas/.m2/repository/junit/junit/4.7/junit-4.7.jar

因此,问题似乎来自需要JUnit v3.8.1的jar。尽管设置为依赖于JUnit 4,但为时已晚。testngTest Classpath

testng依赖关系位于我的 POM 中:

<dependency>
  <groupId>org.testng</groupId>
  <artifactId>testng</artifactId>
  <version>5.8</version>
  <scope>test</scope>
  <classifier>jdk15</classifier>
</dependency>

在我注释掉它之后,测试立即开始执行。

经验 教训:

  • mvn dependency:tree是不是总是不够,就是朋友。mvn -X
  • surefire不是为开发人员的天堂而生的(我在查看项目JIRA报告时已经意识到了这一点)。尤其如此,因为如果您使用Maven,则没有其他选择。

谢谢大家的帮助。不幸的是,没有办法在Pascal和Kaleb之间拆分答案点,但是Kaleb的建议帮助我走上了正确的轨道,所以正确的答案点归他所有。mvn -X


答案 2

Surefire插件根据类路径确定应该使用哪个JUnit提供程序。如果类路径上有多个 JUnit 版本,则可以更正类路径以在类路径上只有一个 JUnit 版本(如上所述),也可以显式指定要使用的提供程序。例如,在(父)POM中指定以下内容,使用最新的提供程序(例如,“surefire-junit47”):

[...]
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.8</version>
  <dependencies>
    <!-- Force using the latest JUnit 47 provider -->
    <dependency>
      <groupId>org.apache.maven.surefire</groupId>
      <artifactId>surefire-junit47</artifactId>
      <version>2.8</version>
    </dependency>
  </dependencies>
[...]

但请注意,Surefire 2.7 改变了它确定运行哪些单元测试类的方式。将 Surefire 2.7(或更高版本)与 JUnit 4 配合使用时的新行为是,任何没有@Test注释的测试都将自动跳过。如果您只有 JUnit 4 单元测试,这可能很棒,但是如果您有 JUnit 3 和 4 单元测试的组合,则使用 “surefire-junit47” 提供程序将无法正常工作。在这种情况下,最好明确选择“surefire-junit4”提供程序:

[...]
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.8</version>
  <dependencies>
    <dependency>
      <groupId>org.apache.maven.surefire</groupId>
      <!-- Use the older JUnit 4 provider -->
      <artifactId>surefire-junit4</artifactId>
      <version>2.8</version>
    </dependency>
  </dependencies>
[...]

推荐