【问题标题】:Maven build fails with Java 8 and JUnit 5Java 8 和 JUnit 5 的 Maven 构建失败
【发布时间】:2020-04-28 17:14:33
【问题描述】:

我有一个使用 Java 8 的 Java 项目。我想使用 JUnit 5。我正在使用 Eclispe。如果我在项目的构建路径中添加 JUnit 5 库,则在 Eclipse 中构建成功。但是,当我在命令行使用 Maven 构建时,它会失败。

    Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
    Maven home: C:\Program Files\apache-maven-3.6.3\bin\..
    Java version: 1.8.0_241, vendor: Oracle Corporation, runtime: C:\Program 
    Files\Java\jdk1.8.0_241\jre

在 pom.xml 下方。我尝试过在谷歌搜索中找到的其他版本的 pom,但都给了我同样的错误。 更新: 如果我从 pom.xml 中删除 <scope>test</scope>,构建仍然失败。

<properties>
    <!-- Dependency versions -->
    <junit.jupiter.version>5.6.0</junit.jupiter.version>
    <maven-surefire-plugin.version>2.22.2</maven-surefire-plugin.version>
    <!-- Java 8 -->
    <java.version>1.8</java.version>
    <!-- Encoding -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  </properties>
  <!-- Jupiter API for writing tests -->
  <dependencies>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-engine</artifactId>
      <version>${junit.jupiter.version}</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <!-- Maven Surefire plugin to run tests -->
  <build>
    <plugins>
       <!-- plugin to run test cases from maven -->
      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>${maven-surefire-plugin.version}</version>
      </plugin>
      <!-- Maven plugin to use perticular java version to compile code -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
[INFO] 5 errors
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  7.473 s
[INFO] Finished at: 2020-04-28T12:19:11-04:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project Java8: Compilation failure: Compilation failure:
[ERROR] C:\Users\Documents\Java8\src\main\java\com\name\stream\ClassName.java:[8,23] error: package org.junit does not exist
[ERROR] C:\Users\Documents\Java8\src\main\java\com\name\stream\ClassName.java:[8] error: static import only from classes and interfaces
[ERROR] C:\Users\Documents\Java8\src\main\java\com\name\stream\ClassName.java:[31,2] error: cannot find symbol
[ERROR]   symbol:   method assertEquals(Optional<String>,Optional<Object>)
[ERROR]   location: class ClassName
[ERROR] C:\Users\Documents\Java8\src\main\java\com\name\stream\ClassName.java:[33,2] error: cannot find symbol
[ERROR]   symbol:   method assertEquals(Optional<Optional<String>>,Optional<Object>)
[ERROR]   location: class ClassName
[ERROR] C:\Users\Documents\Java8\src\main\java\com\name\stream\ClassName.java:[44,2] error: cannot find symbol
[ERROR]   symbol:   method assertEquals(Optional<String>,Optional<Object>)
[ERROR]   location: class ClassName
[ERROR] -> [Help 1]

【问题讨论】:

  • JUnit Jupiter 的导入来自org.junit.jupiter.api.Test,而不是来自org.junit?此外,您正在尝试在 src/main/java 中进行测试,这将不起作用,因为您已经在范围测试中定义了 junit jupiter 的依赖关系,这意味着您必须在 src/test/java 位置进行单元测试并命名为 *Test.java 而不是src/main/java...
  • 在 Eclipse 中构建成功,这是我在 Eclipse 中使用 JUnit 5 库的导入语句: import static org.junit.Assert.assertEquals;如果我删除 test,构建仍然失败。
  • Eclipse 没有正确分离测试范围和编译范围依赖,所以保持范围测试是正确的。您必须在 src/test/java/com/name/stream/ClassNameTest.java 中创建一个 Test 类并使用需要来自 org.junit.jupiter.api 包的适当注释。
  • 看看这个示例项目:github.com/khmarbaise/basic-junit-jupiter-test(简单的测试用例和断言也是一个简单的类,只有一个方法来展示它是如何工作的......)......它建立在命令行上,在 IDEA Intellij 中,也应该在 Eclipse 中工作并在 GitHub Actions 上工作......
  • 当我创建Test类并编译时,构建成功。如果愿意,请在答案部分添加您的回复,我可以接受。我可能有一个 Java 代码 - 在使用 JUnit 5 库中的一些类的“scr/main”中,我知道这不是最佳实践,但是......你知道如何修改 pom 以确保构建不会失败吗?删除测试范围不是您提到的解决方案。

标签: java maven java-8 build junit5


【解决方案1】:

Eclipse 没有正确地分离测试范围和编译范围依赖,所以保持范围测试是正确的。您必须在其中创建一个测试类 src/test/java/com/name/stream/ClassNameTest.java 并使用需要来自 org.junit.jupiter.api 包的适当注释

看看这个示例项目:github.com/khmarbaise/basic-junit-jupiter-test(简单的测试用例和断言也是一个简单的类,只有一个方法来展示它是如何工作的......)......它在命令行上构建,在 IDEA Intellij 中,也应该在 Eclipse 中工作并在 GitHub Actions 上工作

【讨论】:

  • 自 Photon (2018) 以来,Eclipse 支持分离主范围和测试范围 - 请参阅 eclipse.org/eclipse/news/4.8/jdt.php#jdt-test-sources。 @blueSky 请查看您在 Eclipse 中的项目配置。在 Java Build Path 下,src/test/java 是否标记为“包含测试源”?还有,Eclipse 中的 JUnit 依赖到底是怎么配置的?
猜你喜欢
  • 1970-01-01
  • 2021-07-23
  • 2018-01-04
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
相关资源
最近更新 更多