在 Spring Boot 应用程序中运行 JUnit 单元测试而不提供数据源

Posted

技术标签:

【中文标题】在 Spring Boot 应用程序中运行 JUnit 单元测试而不提供数据源【英文标题】:Run JUnit unit tests in Spring Boot application without providing datasource 【发布时间】:2016-10-11 21:36:12 【问题描述】:

我正在尝试构建一个 Spring Boot 应用程序,并尝试坚持测试驱动开发。我的问题是我的项目中包含了 Spring Boot JPA,但实际上还没有设置数据源。在添加依赖项之前,我能够成功运行我的单元测试。

现在我已经添加了依赖项,即使尝试执行我的单元测试也会失败,因为它无法为 Spring Data 初始化数据源。

不过,我对 JUnit、Spring Boot 和 Mockito 还是很陌生。我希望能够在没有实际数据源的情况下运行我的单元测试,而是模拟我所有的存储库。

这样做的正确方法是什么?

【问题讨论】:

请澄清您的具体问题或添加其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。请参阅“如何提问”页面以获得澄清此问题的帮助。 此链接可能对您有用:***.com/questions/34756264/… 为测试套件创建一个单独的配置文件并禁用 JPA 的自动配置。 您还可以使用MockitoRunner 而不是 Spring Runner 执行一些测试(控制器、服务)。这不会实例化整个上下文,而只是将依赖项作为 Mocks 注入。这也有助于加快测试速度。我们通常只使用 SpringRunner 进行集成测试。 【参考方案1】:

第一步。添加到pom.xml 某种内存数据库。例如h2:

<dependency>
  <groupId>com.h2database</groupId>
  <artifactId>h2</artifactId>
  <version>1.4.191</version>
  <scope>test</scope>
</dependency>

然后在位于 (src/test/resources) 的测试 application.properties 中配置测试数据源:

spring.jpa.generate-ddl=false
spring.jpa.hibernate.ddl-auto=none
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.H2Dialect

spring.datasource.platform=h2
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:test;MODE=mysql;IGNORECASE=TRUE
spring.datasource.username=SA
spring.datasource.password=

这只是使用mysql 支持模式在内存中运行h2 的示例。但是您可以使用其他模式(sql support),甚至根本不设置此参数。

【讨论】:

【参考方案2】:

如果你定义了一些通常用于测试的 SQL 引擎(例如 HSQL、Derby 或 H2),Spring Boot 应该将其识别为测试依赖并在其之上配置 Datasource bean。为此,只需定义具有测试范围的此类引擎:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>test</scope>
</dependency>

当您引入生产数据源(例如 Postgres 或 MySQL)时会出现问题。在那种状态下,您需要

使用@Primary 注释显式配置测试数据源 或提供将配置 H2 的测试配置文件(例如src/test/resources/application.properties)。

【讨论】:

以上是关于在 Spring Boot 应用程序中运行 JUnit 单元测试而不提供数据源的主要内容,如果未能解决你的问题,请参考以下文章

为啥 spring-boot 应用程序无法在 AWS 中运行,但在本地运行良好?

如何在 Eclipse 本身中运行 Spring Boot Web 应用程序?

如何在weblogic上运行spring boot

docker 镜像正在运行,但无法在 Spring Boot 应用程序中访问 REST 端点

使用 IDE 运行 Spring-boot 的 main

无法加载在 Docker 中运行的 Spring Boot 应用程序