85

我正在尝试使用 Maven 构建一个简单的 Java 项目。在我的 pom 文件中,我将 JUnit 4.8.2 声明为唯一的依赖项。Maven 仍然坚持使用 JUnit 3.8.1 版本。我如何解决它?

问题表现为编译失败:“包 org.junit 不存在”。这是因为我的源代码中的 import 语句。JUnit 4.* 中正确的包名称是 org.junit.* 而在版本 3.* 中是 junit.framework.*

我想我已经在http://maven.apache.org/plugins/maven-surefire-plugin/examples/junit.html上找到了有关问题根源的文档,但那里的建议似乎是针对 Maven 专家的。我不明白该怎么办。

4

17 回答 17

55

只是为了帮助访客获得完整解决方案的答案:

您需要做的就是将 junit 依赖项添加到pom.xml. 不要忘记<scope>test</scope>

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>
于 2013-07-11T18:30:13.973 回答
47

@Dennis Roberts:你完全正确:我的测试类位于 src/main/java 中。此外,JUnit 的 POM 中“范围”元素的值是“测试”,尽管它应该是这样的。问题是我在 Eclipse 中创建测试类时马虎,导致它在 src/test/java 的 src/main/java 中创建。运行“mvn eclipse:eclipse”后,这在 Eclipse 的 Project Explorer 视图中变得更容易看到,但您的评论是让我首先看到它的原因。谢谢。

于 2011-05-16T21:47:02.583 回答
20

我的问题是我里面的一条线,我pom.xml删除了<sourceDirectory>${basedir}/src</sourceDirectory>这条线,使 maven 使用常规结构文件夹,这解决了我的问题

于 2014-03-06T22:11:15.313 回答
12

为 junit 删除 pom.xml 中的范围标记有效..

于 2015-01-19T06:13:11.847 回答
5

我有同样的问题。我所做的只是 - 从 pom.xml 文件中,我删除了 junit 3.8 的依赖项,并为 junit 4.8 添加了一个新的依赖项。然后我做了 maven clean 和 maven install。它成功了。为了验证,在 maven install 之后,我去了 project->properties-build path->maven dependencies,看到现在 junit 3.8 jar 不见了!,而是列出了 junit 4.8 jar。凉爽的!!。现在我的测试运行起来就像一个魅力..希望这会有所帮助..

于 2012-09-29T13:28:27.420 回答
5

将此依赖项添加到您的pom.xml文件中:

http://mvnrepository.com/artifact/junit/junit-dep/4.8.2

<!-- https://mvnrepository.com/artifact/junit/junit-dep -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit-dep</artifactId>
    <version>4.8.2</version>
</dependency>
于 2013-08-02T12:33:03.463 回答
4

你是如何声明版本的?

<version>4.8.2</version>

请注意此处解释的此声明的含义(请参阅注释)

当为 Junit 声明“正常”版本(例如 3.8.2)时,在内部这表示为“允许任何内容,但更喜欢 3.8.2”。这意味着当检测到冲突时,允许 Maven 使用冲突算法来选择最佳版本。如果指定[3.8.2],则表示只使用3.8.2,不使用其他。

要强制使用 4.8.2 版本,请尝试

<version>[4.8.2]</version>

由于您的项目中没有任何其他依赖项,因此不应该有任何冲突导致您的问题。如果您能够从存储库中获取此版本,则第一个声明应该适合您。您是否从父 pom 继承依赖项?

于 2011-05-04T19:41:20.293 回答
4

我的情况是一个简单的疏忽。

我将 JUnit 依赖声明放在节点<dependencies>下而不是POM 文件中。正确的做法是:<dependencyManagement/><project/>

<project>
<!-- Other elements -->
    <dependencies>
    <!-- Other dependencies-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
    </dependencies>
<project>
于 2017-06-13T16:32:13.617 回答
3

我将文件放在正确的位置,只需<scope>test</scope>从 JUnit 依赖项中删除即可解决问题(我使用的是 JUnit 4.12)。我相信,test在编译阶段,依赖关系只是被忽略了。现在即使我打电话也一切正常mvn test

于 2017-02-22T18:48:40.560 回答
3

我在注入依赖项的父项目的子项目的“test-utils”项目中遇到了一个非常相似的问题(向 JUnit 添加功能、规则和断言)。依赖于 org.junit.rules 包的类位于 src/main/java 中。

所以我在没有测试范围的情况下添加了对 junit 的依赖,它解决了这个问题:

test-util 项目的 pom.xml :

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
</dependency>

父项目的 pom.xml :

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <scope>test</scope>
</dependency>
于 2017-11-21T10:21:15.800 回答
2

我也有同样的问题,如下所示。

在此处输入图像描述

为了解决这个问题,下面的行被添加到dependencies应用程序级 build.gradle 的部分。

compile 'junit:junit:4.12'
androidTestCompile 'com.android.support.test:runner:0.5'

Gradle build 然后报告以下警告。

Warning:Conflict with dependency 'com.android.support:support-annotations'. 
Resolved versions for app (25.1.0) and test app (23.1.1) differ. 
See http://g.co/androidstudio/app-test-app-conflict for details.

为了解决这个警告,以下部分被添加到应用级 build.gradle。

configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-annotations:23.1.1'
    }
}
于 2017-12-09T10:35:03.073 回答
1

我在 Eclipse 编译我的代码时遇到了类似的问题,但是每次编译测试时 Maven 都失败了,尽管事实上 JUnit 在我的依赖项列表中并且测试在 /src/test/java/ 中。

就我而言,我的依赖项列表中的 JUnit 版本错误。我编写了 JUnit4 测试(带有注释),但我的依赖项是 JUnit 3.8.x。在 JUnit 3.8.x 和 4 版本之间,他们将包名从 junit.framework 更改为 org.junit,这就是为什么 Maven 仍然会中断使用 JUnit jar 进行编译的原因。

我仍然不完全确定为什么 Eclipse 成功编译。它必须在类路径中的某处拥有自己的 JUnit4 副本。希望这种替代解决方案对人们有用。在按照上面的亚瑟链接之后,我达到了这个解决方案。

于 2011-09-26T13:05:48.730 回答
1

我也遇到了这个问题 - 我试图从源中提取一个对象,它在测试代码中工作,但不是 src 代码。为了进一步测试,我从测试中复制了一段代码并将其放入 src 代码中,然后立即删除了 JUnit 行,这样我就知道了测试是如何拉入对象的。然后突然我的代码无法编译。
问题是,当我将代码放入其中时,Eclipse 有助于解决所有类,因此我的 src 代码中有 JUnit 调用,这是不正确的。我应该注意到顶部关于未使用导入的警告,但我忽略了它们。
一旦我在我的 src 文件中删除了未使用的 JUnit 导入,它就运行得很好。

于 2017-01-23T20:34:32.830 回答
0

如果您在 src/main/java Utils 中有代码,请找到此错误的一种解决方案

<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.9.1</version>
</dependency>
于 2018-08-29T08:27:12.343 回答
0

更改 junit 版本为我解决了这个问题。似乎版本 3.8.1 在我的情况下不起作用。将其更改为 4.12 后已修复问题

于 2018-10-14T17:13:07.983 回答
0

我遇到了这个问题,这就是我解决它的方式:

语境:

  • SpringBoot 应用程序
  • 使用maven管理多个模块
  • junit在根 POM 中添加maven 依赖项dependencyManagement(而不是dependencies,他们的区别可以在这里找到)
  • 打算测试根模块的子模块之一内的类或文件夹

PS:如果您的情况与以上上下文不符,此方案可能无法解决您的问题。

脚步

  1. 右键单击要测试的类或文件夹:
    在此处输入图像描述
  2. 选择More Run/Debug->Modify Run Configuration
  3. 将模块选项更改为要从根模块 测试的选项在此处输入图像描述
于 2022-02-10T10:49:25.370 回答
-1

默认情况下,maven 分别查看这些文件夹中的 java 和 test 类 - src/main/java 和 src/test/java

当使用 source 下的测试类指定 src 并且 pom.xml 中的 junit 依赖范围被提及为 test - org.unit 将不会被 maven 找到。

于 2015-10-23T06:20:02.187 回答