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

Spring-boot-test依赖项必须手动导入,尽管它们存在于spring-boot-starter-parent-why中?

禄仲渊
2023-03-14

我正在运行一个带有spring-boot-starter依赖项的Spring Boot应用程序,如果我不导入以下测试依赖项,我将面临测试用例中的编译错误

  • spring-boot-test
  • Spring测试
  • AssertJ-核心

我的理解是这些已经存在于spring-boot-starter-parent中,我也可以看到它们。但是,由于编译时错误,我被迫将它们导入到pom.xml中,如下所示,但随后我会得到以下警告:

复制用于spring-boot-test的托管版本1.5.6发行版

复制用于spring-test的托管版本4.3.10.Release

与assertj-core类似

 <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
    <json.version>20160810</json.version>   
</properties>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.6.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jdt.core.compiler</groupId>
        <artifactId>ecj</artifactId>
        <version>4.6.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.hateoas</groupId>
        <artifactId>spring-hateoas</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    <!-- <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency> -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-test</artifactId>
        <version>1.5.6.RELEASE</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>4.3.10.RELEASE</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.assertj</groupId>
        <artifactId>assertj-core</artifactId>
        <version>3.8.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>${json.version}</version>
    </dependency>

下面是我的代码中如果不包含测试依赖项就会出现编译错误的部分。如果不存在依赖项,则无法导入@SpringBootTest和TestRestTemplate。

import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import com.fasterxml.jackson.core.JsonProcessingException;

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 
public class MatchControllerTest {

    // Test RestTemplate to invoke the APIs.
    @Autowired
    private TestRestTemplate testRestTemplate;
    //....and other part of the code

为什么会出现这种情况?

  1. 如果测试依赖项已经存在于spring-boot-starter-parent中,为什么必须手动将它们包含在pom.xml中
  2. 一旦包含,它就会显示一个重复托管版本警告(可能是正确的...)。

我可能做了什么傻事/错事--请帮帮我!

共有1个答案

蒙华翰
2023-03-14

正如您在POM中所看到的:

<dependencyManagement>
        <dependencies>
            <!-- Spring Boot -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot</artifactId>
                <version>1.5.6.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot</artifactId>
                <type>test-jar</type>
                <version>1.5.6.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-test</artifactId>
                <version>1.5.6.RELEASE</version>
            </dependency>
 ...

依赖项位于标记 之下。这意味着,如果您在项目中需要它,您将获得1.5.6.release版本

所以你只需要加上

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-test</artifactId>
        <scope>test</scope>
    </dependency>
 类似资料:
  • 我有一个基本的Spring Boot项目,在这个项目中,我试图用RabbitMQ实现简单的消息传递。当我将spring-boot-starter-amqp依赖项添加到我的文件并启动Spring Boot应用程序时,我会得到导致的异常: pom.xml 如果我从pom.xml中移除spring-boot-starter-amqp依赖项,项目将不会出错:

  • 我有一个Spring启动应用程序,我最近从v1.3.3. RELEASE升级到v1.4.2. RELEASE。 用于我在v1中的集成测试。3.3,我有一个豆子,我能够成功地监视它。我在运行测试时,配置文件,下面的被激活,而不是应用程序的。 我正在升级到v1。4.2.发布并希望使用spyBean注释模拟单个方法,而不依赖于概要文件。 我对我的测试方法做了以下改变,以尝试它- 然而,当我尝试上述方法时

  • src/main/resources/application.yml 来自Spring文档: 创建一个名为application.yml的文件并将其放在类路径的根目录中,还将snakeyaml添加到依赖项中(如果使用spring-boot-starter,Maven坐标org.yaml:snakeyaml已经包含在内)。 在这个问题上有人能帮我吗? pom.xml

  • 对于 REST API 的测试部分。正在查看可以在Spring启动中使用的依赖项。我看到有JUnit依赖项和Spring启动器测试依赖项。 JUnit依赖项和Spring Boot启动器测试依赖项有什么区别?

  • 但是我不明白为什么用Spring Boot测试有两个工件,它们之间有什么区别?也许有了后者,我也在进口前者?

  • 我使用的是eclipse 2018、gradle 5.2.1、buildship 3.0.1。 我的配置看起来像: 我尝试根据building-spring-boot-2-projects-with-gradle创建spring boot 2 是: 但是,在我保存构建之后。gradle,项目和外部依赖关系消失,Spring Bootjar也没有下载。 我错了什么? 如果我使用gradle by s