当前位置: 首页 > 知识库问答 >
问题:

具有测试范围的junit的Maven构建失败

冉俊德
2023-03-14

我有一个非常简单的junit测试类,它用Eclipse junit Launcher成功运行。

下面是JUnit的pom依赖项。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

   ...
<dependencies>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <version>1.10.19</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest-all</artifactId>
        <version>1.3</version>
        <scope>test</scope>
    </dependency>
...
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
        </plugin>
    </plugins>
</build>

</project>

但是,在运行maven build时,我会收到以下错误消息:

MyTest.java:[3,24] package org.junit does not exist

并且,在从junit依赖项中删除 test 之后,构建成功运行。

为什么它的测试范围失败,如何修复它?

我使用的是Java 8和Maven 3.3.9版本。

编辑-添加最小、完整和可验证的代码

由于我不能共享实际的代码,我创建了一个演示测试类,并在下面得到了相同的错误。

/MyProject/demo/src/test/java/com/MyTest.java:[3,24] package org.junit does not exist
/MyProject/demo/src/test/java/com/MyTest.java:[3,1] static import only from classes and interfaces
/MyProject/demo/src/test/java/com/MyTest.java:[5,17] package org.junit does not exist

MyTest类:

package com;

import static org.junit.Assert.assertEquals;

import org.junit.Test;

public class MyTest {

    @Test
    public void demo() throws Exception {

        int expected = 10;
        int actual = 10;

        assertEquals(expected, actual);
    }
}

而且,它是一个多模块的项目。JUnit依赖项在common模块下,测试类在demo模块下。

demo模块中的pom.xml以包括常见的模块依赖项:

<dependencies>

    <dependency>
        <groupId>myproject</groupId>
        <artifactId>common</artifactId>
        <version>1.0</version>
    </dependency>

</dependencies>

然而,在将MyTest类复制到公共模块后,构建成功。因此,公共模块中的junit依赖项似乎没有导入到演示模块中。

共有1个答案

瞿宏儒
2023-03-14

在Maven中,并不是所有的可传递依赖项(依赖项的依赖项)都被添加到类路径中--这取决于作用域。如果可传递依赖项是testprovided作用域,则永远不会将它们添加到类路径中。这是有意义的,因为如果您将库添加到依赖项中,您就不希望依赖于它的测试库。

参见Maven对依赖机制#依赖范围的介绍,特别是小节底部的表格。

所以解决方案是将junit依赖项添加到您的目标模块中(而不是添加到您的公共模块中)。或者将其添加到父模块中(这有点奇怪,因为不是每个模块都需要这种依赖关系),这将有效地将其添加到所有子模块中。

 类似资料:
  • 首先请原谅我可能的无知,专业的做事方式对我来说很新鲜,如果有什么我没有提到的,请告诉我,我会尽力给你你需要的信息。。。 所以我试图用maven在Eclipse中构建我的webapp,我有一个测试套件 这很好,当我右键单击并以Junit test运行测试时,所有测试都通过了。 当我以Maven build的形式运行它,并以打包一系列测试为目标时,失败了??? 我的maven surefire插件配置

  • 我们有一组UI测试每晚运行,有时一些测试由于网络故障而失败。为了避免假阴性测试结果,我使用了,它可以重新运行失败的测试多达3次。 当我从Eclispe右键单击套件运行测试时,它工作得非常好。xml—如果测试最初失败,但重试时通过,则第一个结果不算作失败。 但是,当作为Maven构建的一部分运行相同的测试时,如果任何测试失败,即使在重试时成功通过,构建也会失败。 例如,运行一个包含5个测试的套件,其

  • 我正在TFS2015中运行一个构建,我得到了这个错误: 在org.apache.maven.lifecycle.internal.mojoexecutor.execute(mojoexecutor.java:217) 原因:org.apache.maven.plugin.MojoExecutionException:编译时出现致命错误 222 2018-07-25T11:22:37.0150577

  • 问题内容: 在我们的项目中,我有几个JUnit测试,例如从目录中获取每个文件并对其进行测试。如果我在中实现了一种方法,那么它只会显示为可能失败或成功的一项测试。但是我对每个文件的结果都很感兴趣。如何编写一个/ 使得每个文件显示为单独的测试,例如在Eclipse的图形TestRunner中?(为每个文件编写显式测试方法不是一种选择。) 问题答案: 看看JUnit 4 中的 参数化测试 。 实际上,我

  • 我正在jenkins上运行一组测试,我得到以下结果: 好的东西告诉我行: maven-surefire-插件: 2.16是这里的问题,所以这里是我的pom文件检查: 我已经检查了maven仓库中的插件,我看到的唯一区别是插件标签中有插件,而在网站中它是在依赖标签中。 这里可能有什么错误? 谢谢 注:抱歉纯文本,但我不知道如何给代码上色=/

  • 问题内容: 我正在使用JUnit 4.4和Maven,并且有大量的长时间运行的集成测试。 关于并行化测试套件,有一些解决方案可以让我在单个测试类中并行运行每个测试方法。但是所有这些都要求我以一种或另一种方式更改测试。 我真的认为,在X线程中并行运行X个不同的测试类将是一种更干净的解决方案。我有成百上千的测试,所以我真的不在乎线程测试类。 问题答案: 使用Maven插件: