在内存数据库中使用 Spring Boot 测试

Posted

技术标签:

【中文标题】在内存数据库中使用 Spring Boot 测试【英文标题】:Spring Boot testing using in memory db 【发布时间】:2013-11-05 08:49:20 【问题描述】:

我使用 Spring Boot 创建了一个 Spring Web 项目。 想了解测试周围的实践。我需要一个内存嵌入式数据库,比如 hsql 或 h2 用于我的具有初始 schema.sql 的junit。 在主应用程序上,数据库可以是 mysql 或 oracle

在非 Spring Boot 项目中,我们通常会有一个单独的 applicationcontext.xml,由 Web 应用程序引用,为了进行测试,我们将使用 applicationContext-text.xml

现在,在 Spring Boot 中,一切都是自动创建的,而且 Spring Boot 也被认为是可行的。想知道如何为 Junits 设置一个嵌入式内存数据库,为应用程序设置一个外部数据库(如 MySQL)。

我能想到的一个解决方案是使用配置文件。带有 2 个属性文件 application.properties 和 application-test.properties。并为我的junits使用测试配置文件。

关于我应该采取的方法的任何建议。

【问题讨论】:

【参考方案1】:

配置文件确实是推荐的方法。我要做的可能是将内存中实现设置为“默认”配置文件(它是无害的,因为您永远不会更改任何真实数据,因此最好将其设为默认值,以防有人不小心对真实数据库运行它)。就个人而言,我更喜欢将所有外部配置放在一个 application.yml 文件中,但这完全取决于您。在外部配置中,您需要提供有效的驱动程序类和 URL,例如

spring:
  datasource:
    driverClassName: org.h2.Driver
    url: jdbc:h2:mem:test;MODE=PostgreSQL
    schema: classpath:/schema.sql

---

spring:
  profiles: local
  datasource:
    url: jdbc:postgresql://localhost/test
    username: root
    password: changeme
    driverClassName: org.postgresql.Driver
    schema:

(请注意,H2 具有 postgres 兼容模式,因此在生产环境中作为 postgres 的补充非常好。)

【讨论】:

profiles: local 是错字吗?这似乎表明完整的 Postgres 数据库是本地数据库,而内存数据库是用于生产的。 这不是错字。也许您希望配置文件有一个不同的名称,但没有标准或约定。 啊,我没有正确理解你答案的第一段。谢谢戴夫。

以上是关于在内存数据库中使用 Spring Boot 测试的主要内容,如果未能解决你的问题,请参考以下文章

在内存数据库中使用 H2 进行 Spring Boot 集成测试

如何在 Spring Boot 测试中连接到内存中的 HSQLDB 以进行查询

使用 Liquibase 为 Spring Boot 应用程序中的单元测试初始化​​内存 H2

如何在 Spring Boot 中使用 testng 测试数据库调用

在java Spring Boot中,如何在集成测试中将内存中的LDAPConnection对象传递给ldapService?

Spring Boot内存泄露,排查竟这么难