在 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 应用程序?